Java 找不到媒体类型为application/json的MessageBodyWriter
我正在用Jetty做一个小的RESTful服务。使用Maven作为构建工具 当我尝试调用试图访问对象的JSON表示的GET方法时,我得到一个“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
@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
作为值