【问题标题】:Jersey, JSON API, "415 Unsupported Media Type"泽西岛,JSON API,“415 不支持的媒体类型”
【发布时间】: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 创建基本端点时,我得到了预期的响应。

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

【问题讨论】:

  • 可以加NTReport吗?
  • 您的 JSON-to-Java 绑定提供程序是什么?
  • 另外,在我的帖子中添加了更多代码。
  • 我看到您使用的是 Jersey 2。请查看this。您需要添加json provider(如果尚未添加)。
  • 删除我之前的评论,看来我可能没有加载正确的提供程序...我会用更多信息更新我的问题。

标签: java json jersey


【解决方案1】:

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

【讨论】:

  • 你能给我一些实现的例子吗?我将依赖项添加到pom.xml,但该类似乎无法识别@XmlRootElement
  • JAXB 需要默认构造函数。即NTReport() {}。确保也添加它
  • 是的,刚刚注意到了。 import javax.xml.bind.annotation.XmlRootElement; 也使 @XmlRootElement 工作。我现在正在浏览您答案中的第二个链接,填补空白......
  • 另外,没有设置方法。我不确定 JAXB 是否能够设置私有字段。您可以添加另一个构造函数。
  • 也看到了。不过,我仍然在最初的问题中遇到了最后一个错误。我前不久加的,以防你没看到。感觉好像需要以某种方式为 JSON 添加提供者实体?
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2014-05-10
  • 2019-05-01
  • 2017-09-14
相关资源
最近更新 更多