【问题标题】:MessageBodyWriter not found for media type=application/json未找到媒体类型 = 应用程序/json 的 MessageBodyWriter
【发布时间】:2015-07-25 19:52:35
【问题描述】:

我正在使用 Jetty 制作一个小型 RESTful 服务。使用 Maven 作为构建工具。

当我尝试调用尝试访问对象的 JSON 表示的 GET 方法时,我收到“MessageBodyWriter”错误。有问题的方法如下,

@Path("/gtfs-rt-feed")
public class GtfsRtFeed {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getGtfsRtFeed(){

        GtfsRtFeedModel feedInfo = new GtfsRtFeedModel();
        feedInfo.setStartTime(121334);
        feedInfo.setGtfsId(1);
        feedInfo.setGtfsUrl("http://www.google.com");
        Gson gson = new Gson();

        return Response.ok(feedInfo).build();
    }
    ...

GtfsRtFeedModel的GtfsRtFeedModel如下,

@XmlRootElement
public class GtfsRtFeedModel {
    private String gtfsUrl;
    private int gtfsId;
    private long startTime;

    public GtfsRtFeedModel(){}

    public String getGtfsUrl() {
        return gtfsUrl;
    }
    ...//Getters and setters for all private variables below

我的 Maven 文件包括以下内容以及码头依赖项,

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-jetty-http</artifactId>
        <version>2.19</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.19</version>
    </dependency>

添加jersey-media-moxy 和所需的依赖项似乎解决了大多数类似问题。但是由于我已经在我的 Maven 文件中包含了它们,所以我无法弄清楚我缺少什么。

任何帮助将不胜感激。

编辑:添加了码头代码 我的码头代码如下,

public static void main(String[] args) throws Exception{
    GTFSDB.InitializeDB();
    Datasource ds = Datasource.getInstance();
    ds.getConnection();

    Server server = new Server(8080);
    ServletContextHandler context = new ServletContextHandler();
    context.setContextPath("/");
    context.setResourceBase(BASE_RESOURCE);

    server.setHandler(context);

    context.addServlet(RTFeedValidatorServlet.class, "/validate");
    context.addServlet(GTFSDownloaderServlet.class, "/downloadgtfs");
    context.addServlet(FeedInfoServlet.class, "/feedInfo");
    context.addServlet(TriggerBackgroundServlet.class, "/startBackground");
    context.addServlet(GetFeedJSON.class, "/getFeed");

    context.addServlet(DefaultServlet.class, "/");

    ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/api/*");
    jerseyServlet.setInitOrder(1);
    jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "edu.usf.cutr.gtfsrtvalidator.api.resource");


    server.start();
    server.join();
}

【问题讨论】:

  • 您是否偶然禁用了代码中的自动发现功能?
  • 不,但我也没有手动启用它。也许我应该因为我使用的是嵌入式 Jetty...
  • 你能出示你的码头代码吗?
  • XML“模型”是否应该与其他调用在同一个包中?目前,GET 请求位于“xx.xx.api.resources”中,XML 位于“xx.xx.api.models”中。我只在启动服务器时调用jerseyServlet.setInitParameter("jersey.config.server.provider.packages", "xx.xx.api.resource");。这可能是问题吗?我现在试试改。
  • 尝试添加一个初始化参数jersey.config.server.provider.classnames,以org.glassfish.jersey.moxy.json.MoxyJsonFeature为值

标签: java maven jersey jetty moxy


【解决方案1】:

通常auto-discoverable feature 注册MoxyJsonFeature。我不确定嵌入式 Jetty 是如何工作的。但是如果没有注册,我们可以自己注册。有一个&lt;init-param&gt; 允许我们添加任意数量的提供者,以逗号分隔。在 web.xml 中它会是

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        org.glassfish.jersey.moxy.json.MoxyJsonFeature,
        org.bar.otherresources.MyCatResource
    </param-value>
</init-param>

所以在您的 Jetty 代码中,您可以这样做

jerseyServlet.setInitParameter("jersey.config.server.provider.classnames",
                               "org.glassfish.jersey.moxy.json.MoxyJsonFeature");

MoxyJsonFeature 注册了 MessageBodyWriterMessageBodyReader 将我们的 POJOS 编组和解组到 JSON 和从 JSON 解组。在JAX-RS Entity Providers 中查看更多信息,并在Support for Common Media Type Representations 继续进行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2014-12-06
    • 2014-06-29
    • 2015-12-13
    • 2017-07-24
    • 2021-06-15
    • 2015-05-22
    相关资源
    最近更新 更多