球衣 + 码头 + JSON

Jersey + Jetty + JSON

我想使用 Jetty + Jersey 制作一个 JSON。 我的 POM.XML 类似于此 post:How do I update example to work with latest versions Jetty (9.1.0.RC2) and Jersey (2.7)?。我想我缺少一些依赖性。 inferFile() 的结果返回空白。

我可以看到 Student class 的 toStirng 方法没有被调用。

行家

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

我不太确定你在期待什么。如果您期望 toString() 被调用(实际上不是),那甚至不会产生有效的 JSON。 POJO 到 JSON(反之亦然)的转换是通过 MessageBodyReaders 和 MessageBodyWriters 完成的。基本上,他们正在寻找具有某种形式的注释的字段,这些注释为 marshaller/unmarshaller 或 Java bean 样式的 getter 和 setter。这就是如何发现 JSON 的 data/properties。

例如,如果您的 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");

这是 Jersey 1 的一项功能。您正在使用 Jersey 2。另请参阅

jersey.config.server.provider.packages

因此您不必单独配置每个 class。该值应该是一个包。它将扫描包和子包以查找带注释的 classes.