我有一组实体(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>
答案 0 :(得分:2)
您似乎在邮件正文中将损坏的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服务,即在您的应用程序中注册日志记录过滤器:
new ResourceConfig()
.packages("my.rest.package")
// Register logging filter and print entity.
.register(new LoggingFilter(LOGGER, true));
答案 1 :(得分:0)
或者,您可以将传入的JSON接受为String,并使用任何标准解析器在方法中解析它。
@PUT
public void save(String s) {
// parse s
}
答案 2 :(得分:0)
type erasure后无法使用类型参数。
尝试使用数组而不是列表:
@PUT
@Consumes("application/json")
public void save(Task[] taskArray) {
List<Task> tasks = Arrays.asList(taskArray);
(...)
}