簡體   English   中英

未找到 Media type=application/json 的 MessageBodyWriter

[英]MessageBodyWriter not found for media type=application/json

我正在使用 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();
}

通常,可自動發現的功能會注冊MoxyJsonFeature 我不確定它是如何與嵌入式 Jetty 一起工作的。 但是如果沒有注冊,我們可以自己注冊。 有一個<init-param>允許我們添加任意數量的提供者,用逗號分隔。 在 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>

所以在你的碼頭代碼中,你可以做

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

MoxyJsonFeature注冊了MessageBodyWriterMessageBodyReader以便在我們的 POJOS 與 JSON 之間進行編組和解組。 JAX-RS 實體提供程序中查看更多信息,並在對通用媒體類型表示的支持中繼續

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM