JAX-RS:如何将我的对象列表作为JSON返回?
我看了jackson的文档,它让我困惑:(我的实体看起来像:
@Entity @Table(name = "variable") public class Variable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(unique = true, nullable = false) private String name; @Column @Enumerated(EnumType.STRING) private VariableType type; @Column(nullable = false) private String units; @Temporal(TemporalType.TIMESTAMP) @Column(name = "created_on", nullable = false) private Date createdOn; @Temporal(TemporalType.TIMESTAMP) @Column(name = "retired_on", nullable = true) private Date retiredOn; @Column(nullable = false) private boolean core; }
我的JAX-RS
服务看起来像
@Path("/variable") public class VariableResource { @Inject private VariableManager variableManager; @GET @Produces(MediaType.APPLICATION_JSON) public Response getVariables() { return Response.ok(variableManager.getVariables()).build(); } }
当我使用curl http://localhost:8080/app/rest/variable
测试此服务时,我在服务器日志中看到以下内容
[javax.ws.rs.core.Application]] (http--127.0.0.1-8080-6) Servlet.service() for servlet javax.ws.rs.core.Application threw exception: java.lang.NoSuchMethodError: org.codehaus.jackson.type.JavaType.(Ljava/lang/Class;)V
有什么最简单的方法可以将我的变量列表作为JSON返回?
通常它@XmlRootElement
在你的Entity上添加@XmlRootElement
一样简单(我可以看到你正在使用JPA / Hibernate @Entity
/ @Table
,但是你错过了@XmlRootElement
)。
@Entity @Table(name = "variable") @XmlRootElement public class Variable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(unique = true, nullable = false) private String name; // ... @Column(nullable = false) private boolean core; }
这是针对服务的,使用来自JAX-RS的Response
,并且还直接返回将由JAX-RS自动封送的对象:
@Path("/variable") public class VariableResource { @Inject private VariableManager variableManager; @GET @Produces(MediaType.APPLICATION_JSON) public Response getVariables() { return Response.ok(variableManager.getVariables()).build(); } @GET @Produces(MediaType.APPLICATION_JSON) // Same method but without using the JAX-RS Response object public List getVariablesAlso() { return variableManager.getVariables(); } }
通常人们会创建一个DTO来避免将实体的内部值从数据库暴露给现实世界,但如果您可以公开整个对象,则不是强制性的。
- 阅读Jackson中的嵌入对象
- 解析JSON时jackson错误“非法字符…只允许常规空格”
- 用spring反序列化JSON:未解析的前向引用Jackson Exception
- jackson没有反序列化它已序列化的通用列表
- Java Jackson:反序列化复杂的多态对象模型:JsonMappingException:意外的令牌(START_OBJECT),预期的VALUE_STRING
- jackson使用spring接口列表反序列化对象
- 如何在自定义反序列化器中使用一些Jackson Deserializer?
- 如何忽略Jackson JSON-to-Object映射中的枚举字段?
- Jackson JSON在序列化之前修改对象