2015-07-25 3 views
2

Я делаю небольшую услугу RESTful, используя Jetty. Использование Maven в качестве инструмента построения.MessageBodyWriter не найден для носителя type = application/json

Когда я пытаюсь вызвать метод GET, который пытается получить доступ к представлению объекта JSON, я получаю сообщение об ошибке «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, я не могу понять, что мне не хватает.

Любая помощь будет оценена по достоинству.

EDIT: Jetty код добавлен Мой Jetty код выглядит следующим образом,

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(); 
} 
+1

Вы случайно отключили автообнаружение в своем коде? –

+0

Нет, но я не включил его вручную. Может быть, я должен с тех пор, как я использую Jetty embedded ... – nipuna777

+0

Можете ли вы показать свой код Jetty. –

ответ

1

Обычно auto-discoverable feature регистрирует 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> 

Так что в вашем коде Jetty, вы могли бы сделать

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

В MoxyJsonFeature регистрирует MessageBodyWriterMessageBodyReader и требуется, чтобы мобилизовывать и распаковать наши Pojos и из JSON. См. Больше на JAX-RS Entity Providers и продолжено в Support for Common Media Type Representations