Jersey,JSON API,“415不支持的媒体类型”

问题描述:

我正在开始使用Java,所以期待这是一个非常业余的问题。我正在修改Neo4j的非托管扩展模板。Jersey,JSON API,“415不支持的媒体类型”

我已经定义了一个NTReport类,它被包含在里面,一切都很愉快地编译。对内容类型设置为application/json的端点进行发布会在主题中返回错误。

我也有对象中定义的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创建基本端点时,我会得到预期的响应。

ALSOthis后似乎描述相同的确切问题,所以我会检查它。

我发现另一个错误日志,似乎表明它不知道如何处理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 
+0

请问您可以添加NTReport吗? – lifus 2015-02-11 21:24:32

+0

什么是您的JSON到Java绑定提供程序? – lifus 2015-02-11 21:50:39

+0

此外,我的帖子中增加了更多的代码。 – subvertallchris 2015-02-11 21:53:11

jersey-jsonprovides一套MessageBodyReader<T>MessageBodyWriter<T>。您可以将@XmlRootElement加入您的NTReport或选择任何其他可用于球衣1.x的选项,因为目前neo4j社区服务器uses Jersey 1.9

+0

你能否给我一些例子实施?我添加了依赖到'pom.xml',但这个类似乎并不认可'@ XmlRootElement'。 – subvertallchris 2015-02-11 23:01:58

+0

JAXB需要默认构造函数。 I.e'NTReport(){}'。请务必添加它 – lifus 2015-02-11 23:06:31

+0

是的,只是注意到了这一点。 'import javax.xml.bind.annotation.XmlRootElement; '也使'@ XmlRootElement'工作。我现在正在回答你的答案中的第二个链接,填补空缺...... – subvertallchris 2015-02-11 23:07:51