【发布时间】:2015-02-11 21:07:28
【问题描述】:
我刚开始使用 Java,所以希望这是一个非常业余的问题。我正在修改 Neo4j 的非托管扩展模板。
我定义了一个NTReport 类,它被包含在内,一切都编译得很愉快。对 content-type 设置为 application/json 的端点进行 POST 会返回主题中的错误。
我还在对象中定义了getStatus 方法。
package org.neo4j.example.unmanagedextension;
import org.codehaus.jackson.map.ObjectMapper;
import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;
import org.neo4j.graphdb.*;
import org.neo4j.helpers.collection.IteratorUtil;
import org.neo4j.server.database.CypherExecutor;
import org.neo4j.example.unmanagedextension.NTReport;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@Path("/service")
public class MyService {
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Path("/reports")
public String getReportJava(NTReport report) {
return "Report params: " + report.getMetrics();
}
}
这里是NTReport:
package org.neo4j.example.unmanagedextension;
public class NTReport {
private String endpoints;
private String resolution;
private String metrics;
public String getEndpoints() {
return this.endpoints;
}
public String getResolution() {
return this.resolution;
}
public String getMetrics() {
return this.metrics;
}
}
我的理解是,通过使用@Consumes,它应该将JSON中的键映射到类中的同名变量。我错了吗?
当我使用 @GET 创建基本端点时,我得到了预期的响应。
ALSO,this 的帖子似乎描述了同样的问题,所以我会检查一下。
我发现另一个错误日志似乎表明它根本不知道如何处理 JSON。
Feb 11, 2015 5:46:19 PM com.sun.jersey.spi.container.ContainerRequest getEntity
SEVERE: A message body reader for Java class org.neo4j.example.unmanagedextension.NTReport, and Java type class org.neo4j.example.unmanagedextension.NTReport, and MIME media type application/json was not found.
The registered message body readers compatible with the MIME media type are:
*/* ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
【问题讨论】:
-
可以加
NTReport吗? -
您的 JSON-to-Java 绑定提供程序是什么?
-
另外,在我的帖子中添加了更多代码。
-
我看到您使用的是 Jersey 2。请查看this。您需要添加json provider(如果尚未添加)。
-
删除我之前的评论,看来我可能没有加载正确的提供程序...我会用更多信息更新我的问题。