0

jerseyを使用してリモートURLに投稿できるjacksonを使用して、休止状態のエンティティからjsonオブジェクトを作成しようとしています。休止状態のエンティティを json オブジェクトに変換する方法がわかりません。resteasy-jackson を使用して、localhost からアクセスできる独自の Web サービスを作成し、画面内で json オブジェクトを正しく出力できましたが、自分のアプリに Web サービスを使用せずに json オブジェクトを構築したいと考えていました。おそらく、私はこれについてすべて間違った方法で進んでいますか?すべてのプロパティをjsonオブジェクトに手動で追加する必要はありません。

私がこれまでに試したことは、

インターフェース

@Path("/company")
public interface CompanyResource {

    @GET
    @Produces("application/json")
    public List<Company> getAllDomains();

    @POST
    @Produces("application/json")
    public Response post(Company company);

    @GET
    @Path("{id}")
    @Produces("application/json")
    public Company getDomainObject(@PathParam("id") Integer id);

}

クラス

public List<Company> getAllDomains() {
    return this.companyDAO.findAllCompanies();
}

public Response post(Company company) {
    companyDAO.updateCompany(company);
    return Response.ok().build();
}

public Company getDomainObject(@PathParam("id") Integer id) {
    Company domainObject = this.companyDAO.findCompanyById(id);
    if (domainObject == null) {
        throw new WebApplicationException(Response.Status.NOT_FOUND);
    }
    return domainObject;
}

郵便サービス

public void setupRender() throws GeneralSecurityException, UnsupportedEncodingException {
    try {
        Client client = Client.create();

        String url = kayakoWebService.generateURL();

        WebResource webResource = client.resource(url);

        ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);

        if (response.getStatus() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        }

        //Outputs object rather than json
        System.out.println("test " + companyResource.getDomainObject(1));


    } catch (Exception e) {
        e.printStackTrace();
    }
}

Company.クラス

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Company extends StatefulEntity {

    @Validate("maxLength=50,required")
    private String name;

    @Column(nullable = true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date createDate;

    @Column(nullable = true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date cancelDate;

    @Column(nullable = true)
    @Temporal(TemporalType.TIMESTAMP)
    private Date modifyDate;

    @ManyToOne
    @JoinColumn(name="parent_id")
    private Company parent;

    @Column(nullable = true, length = 5)
    private Integer roomUnitCount;

    @Column(nullable = false, length = 8)
    private String accountNumber;

    @JsonIgnore
    public String getAccountNumber() {
        return accountNumber;
    }

    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber;
    }

        //additional getters setters
    }

cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.datasource">jdbc/domain</property>
        <property name="hbm2ddl.auto">validate</property>

        <property name="hibernate.format_sql">false</property>
        <property name="hibernate.show_sql">false</property>

        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.cache.use_query_cache">true</property>
        <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
        <property name="hibernate.generate_statistics">true</property>
    </session-factory>
</hibernate-configuration>
4

2 に答える 2

1

あなたがやろうとしていることを私が理解しているなら、あなたが達成しようとしていることにあまり役に立たない多くのコードを書いたことになります。1 つには、サーバー側でのみリソース クラスを定義することになっています。そして第二に、それらを直接呼び出すことは問題をはらんでいます。それらはコンテナによって呼び出されるはずのサーバー コンポーネントです。

良いニュースは、Jersey クライアントが非常に堅牢であることです。設定が正しい限り、オブジェクトを適切な形式に自動的にシリアル化します。あなたの場合、クライアントに jersey-json JAR が含まれていることを確認する必要があります。そうである場合は、次のコードを使用して、オブジェクトを JSON に自動的に変換することができます。

Company domainObject = companyDAO.findCompanyById(id);
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON)
    .entity(domainObject, MediaType.APPLICATION_JSON)
    .post(ClientResponse.class);

このコードは、サーバーが のインスタンスで応答していることを前提としていますClientResponse。また、これを機能させるには、クライアント クラスパスに jersey-json と Jackson JAR が必要であることに注意してください。Maven を使用している場合、これらの依存関係を含めるだけで十分です。

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.17</version>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.17</version>
</dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.17</version>
</dependency>

それ以外の場合は、すべての適切な JAR の最小セットを手動で含める必要があります。

  • jackson-core-asl-1.9.2.jar
  • ジャクソン-jaxrs-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • jackson-xc-1.9.2.jar
  • jersey-core-1.14.jar
  • jersey-json-1.14.jar
  • jersey-server-1.14.jar
于 2013-03-13T01:56:21.847 に答える
0

私があなたのことをよく理解していれば、あなたは Java オブジェクトを対応する JSON 表現に変換しようとしています。これはJSONシリアル化と呼ばれ、「stackoverflow」自体に問題について話しているリンクがいくつかあります

  1. より良い Java JSON ライブラリ?
  2. Java JSON シリアル化 - ベスト プラクティス
于 2013-03-13T01:33:22.273 に答える