2015-01-12 3 views
1

Я хотел бы изготовить JSON, используя Jetty + Jersey. Мой POM.XML похож на этот пост: How do I update example to work with latest versions Jetty (9.1.0.RC2) and Jersey (2.7)?. Я предполагаю, что у меня отсутствует какая-то зависимость. Результат inferFile() возвращается пустым.Jersey + Jetty + JSON

Я вижу, что метод toStirng из класса Student не был вызван.

Maven

<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-server</artifactId> 
    <version>9.1.3.v20140225</version> 
</dependency> 

<dependency> 
    <groupId>org.eclipse.jetty</groupId> 
    <artifactId>jetty-servlet</artifactId> 
    <version>9.1.3.v20140225</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.jersey.core</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>2.14</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet-core</artifactId> 
    <version>2.14</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-jetty-http</artifactId> 
    <version>2.14</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <version>2.14</version> 
</dependency> 

Java

public class Student { 

    public Student(){ 
    } 
    @Override 
    public String toString(){ 
     return new StringBuffer(" First Name : ").append("MY FIRST NAME").toString(); 

    } 
} 

@Path("/bulkload") 
public class BulkLoadAPI { 
    @POST 
    @Path("inference") 
    @Consumes(MediaType.TEXT_PLAIN) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Student inferFile() throws URISyntaxException, IOException { 
     Student s = new Student(); 
     return s; 
    } 
} 

public static void main(String[] args) throws Exception { 
    ServletHolder jerseyServlet = new ServletHolder(ServletContainer.class); 
    jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", "service.api.BulkLoadAPI"); 
    jerseyServlet.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", "true"); 

    Server server = new Server(10500); 
    ServletContextHandler context = new ServletContextHandler (server, "/",  Servl etContextHandler.SESSIONS); 
    context.addServlet(jerseyServlet, "/*"); 
    server.start(); 
    server.join(); 
} 

ответ

1

Я не совсем уверен, что вы ожидали. Если вы ожидаете назвать toString() (что это не так), это даже не приведет к действительному JSON. Способ преобразования POJO в JSON (и наоборот) осуществляется через MessageBodyReaders и MessageBodyWriters. В основном они ищут поля с какой-либо формой аннотации, известной маршаллеру/unmarshaller, или Java bean style getters и seters. Вот как будут обнаружены данные/свойства для JSON.

Например, если ваш Student выглядел

public class Student { 

    private String firstName; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
} 

это даст вам JSON как {"firstName":"MyFirstName"}. Вам просто нужно установить свойство

public Student inferFile() throws URISyntaxException, IOException { 
    Student s = new Student(); 
    s.setFirstName("MyFirstNaem"); 
    return s; 
} 

Другое дело, что это не нужно

setInitParameter("com.sun.jersey.api.json.POJOMappingFeature","true"); 

Это особенность Джерси 1. Вы используете Jersey 2. См. Также

jersey.config.server.provider.packages 

Поэтому вам не нужно настраивать каждый класс отдельно. Значение должно быть пакетом. Он будет сканировать пакет и подпакеты для аннотированных классов.

+0

Если я хочу использовать JSON с помощью POJO, мне нужно что-либо изменить или просто изменить @Consumes (MediaType.APPLICATION_JSON) и использовать Student в качестве параметра? Я попробовал это, и теперь я получаю неподдерживаемый тип медиа. –

+0

То, что вы делаете, отлично звучит. Вы используете клиентский API для его отправки? –

+0

Я использую POSTMAN (https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm) для генерации запроса. Нужно ли использовать конкретную библиотеку для отправки запроса? Запрос будет выполнен с использованием angular.js. –

Смежные вопросы