我正在使用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文件中,所以我无法弄清丢失的内容。
jersey-media- moxy
任何帮助,将不胜感激。
编辑:添加的码头代码 我的码头代码如下,
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中,它将是
MoxyJsonFeature
<init- param>
<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寄存器MessageBodyWriter和MessageBodyReader需要编组和取消编组我们的POJO。并从JSON。在JAX- RS实体提供者上查看更多信息,并在对通用媒体类型表示的支持中继续
MessageBodyWriter
MessageBodyReader