Java 找不到媒体类型为application/json的MessageBodyWriter

Java 找不到媒体类型为application/json的MessageBodyWriter,java,maven,jersey,jetty,moxy,Java,Maven,Jersey,Jetty,Moxy,我正在用Jetty做一个小的RESTful服务。使用Maven作为构建工具 当我尝试调用试图访问对象的JSON表示的GET方法时,我得到一个“MessageBodyWriter”错误。所讨论的方法如下: @Path("/gtfs-rt-feed") public class GtfsRtFeed { @GET @Produces(MediaType.APPLICATION_JSON) public Response getGtfsRtFeed(){ G

我正在用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();
    }
    ...
@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
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();
}
GtfsRtFeedModel的GtfsRtFeedModel如下所示:

@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();
    }
    ...
@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
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();
}
我的Maven文件包括以下内容以及jetty依赖项:

    <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>
通常,注册
moxyjson功能
。我不知道它是如何与嵌入式码头协同工作的。但如果不是注册,我们可以自己注册。有一个
,允许我们添加任意数量的提供者,以逗号分隔。在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>

MoxyJsonFeature
注册将POJO封送至JSON和从JSON封送和解封送所需的
MessageBodyWriter
MessageBodyReader
。更多信息请参见,并在

中继续。您是否碰巧在代码中禁用了自动发现功能?没有,但我也没有手动启用它。也许我应该,因为我使用的是Jetty embedded…你能展示一下你的Jetty代码吗?XML“模型”应该和其他调用在同一个包中吗?目前,GET请求位于“xx.xx.api.resources”中,XML位于“xx.xx.api.models”中。我只调用
jerseyServlet.setInitParameter(“jersey.config.server.provider.packages”,“xx.xx.api.resource”)启动服务器时。这可能是问题所在吗?我现在将尝试更改它。尝试添加一个n init参数
jersey.config.server.provider.classnames
,并将
org.glassfish.jersey.moxy.json.MoxyJsonFeature
作为值