JAX-RS:如何将对象列表作为JSON返回?

时间:2013-01-14 20:21:40

标签: java jackson jax-rs

我查看了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.<init>(Ljava/lang/Class;)V

我可以将变量列表作为JSON返回的最简单方法是什么?

1 个答案:

答案 0 :(得分:12)

通常情况下,就像在您的实体上添加@XmlRootElement一样简单(我可以看到您正在使用JPA / Hibernate @Entity / @Table,但您错过了{{ 1}})。

@XmlRootElement

这是针对该服务的,使用来自JAX-RS的@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

通常人们会创建一个DTO来避免将实体的内部值从数据库暴露给现实世界,但如果您可以公开整个对象,则不是强制性的。