Jersey 2.1-使用POJO集合作为JSON字符串



我有一个实体集合(List),需要将其转换为json。

POJO:

public class Task {
    private Long id;
    private String title;
    private Boolean done;
    (...)
}

泽西岛产生以下结果

[{"id":1,"title":"T1","done":false},{"id":2,"title":"T2","done":false}]

当我调用方法时:

@GET
@Override
@Produces("application/json")
public List<Task> findAll() {
    (...)
    return tasks;
}

到目前为止还不错。

现在,我需要使用一个类似的JSON字符串。我认为以下方法会起作用:

@PUT
@Consumes("application/json")
public void save(List<Task> tasks) {
    (...)
}

但我得到的错误如下:

    SEVERE:   line 1:0 no viable alternative at input
'"[{"id":1,"title":"T1","done":true},{"id":2,"title":"T2","done":false}]"'

我做错了什么?这可能吗?

泽西岛的依赖性:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.1</version>
</dependency>

以下是web.xml配置

<servlet>
    <servlet-name>Jersey Servlet</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>my.rest.package</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

似乎您正在发送损坏的JSON作为消息体中的实体,类似于:

POST http://localhost:9998/test/list
Accept: application/json
Content-Type: application/json
"[{"a":"a","b":1,"c":1}]"

对于这样的实体(line 1:0 no viable alternative at input '"[{"a":"a","b":1,"c":1}]"'),我能够得到与您相同的错误。

确保将有效的JSON发送到REST服务,即在Application:中注册日志过滤器

new ResourceConfig()
    .packages("my.rest.package")
    // Register logging filter and print entity.
    .register(new LoggingFilter(LOGGER, true));

或者,您可以接受传入的JSON作为String,并使用任何标准解析器在方法中解析它。

@PUT
public void save(String s) {
   // parse s
}

类型参数在类型擦除后不可用。

尝试使用数组而不是列表:

@PUT
@Consumes("application/json")
public void save(Task[] taskArray) {
    List<Task> tasks = Arrays.asList(taskArray);
    (...)
}

最新更新