4

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 として返す最も簡単な方法は何ですか?

4

1 に答える 1

13

通常、エンティティに を追加するのと同じくらい簡単です (JPA/Hibernate /@XmlRootElementを使用していることがわかりますが、 がありません)。@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;
}

これはサービス用で、ResponseJAX-RS から を使用し、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<Variable> getVariablesAlso() {
        return variableManager.getVariables();
    }
}

多くの場合、エンティティの内部値をデータベースから現実の世界に公開することを避けるためにDTOを作成しますが、オブジェクト全体を公開しても問題ない場合は必須ではありません。

于 2013-01-14T20:39:46.790 に答える