0

アクションパラメーターで不変クラスを使用するWebサービスがあります(これは、プロジェクトに取り組んでいる他の開発者によるものです)-つまり、パブリックセッターはありません。パブリック セッターがないということは、Web サービスがプロパティを認識しないことを意味します。

アイデアは、プライベート セッターを作成し、init注釈が付けられたメソッドPostConstructを Web サービス クラスに追加することでした。メソッド内では、initすべてのプライベート セッターがリフレクションを通じてアクセス可能に設定されます。

問題は、デプロイ中にinitアノテーションが付けられたメソッドPostConstructがまったく呼び出されないことです。JAX-WS を使用して、プロジェクトを Glassfish にデプロイしています。

4

1 に答える 1

1

あなたがやりたいことは、恐ろしいハックのように聞こえます。

問題は、私が正しければ、アクションでパラメーターとして使用されるオブジェクトが不変であることです。幸いなことに、アノテーションを使用して JAXB マッピングをカスタマイズする方法はたくさんあります。クラスを不変に保ちながら、フィールドを JAXB から見えるようにすることが可能であるべきです。

この回答から、次のことがわかります。

package blog.immutable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.NONE)
public final class Customer {

    @XmlAttribute
    private final String name;

    @XmlElement
    private final Address address;

    @SuppressWarnings("unused")
    private Customer() {
        this(null, null);
    }

    public Customer(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }

}

上記のコードが引数なしのコンストラクターを必要とするという事実が気に入らない場合は、このより複雑なアプローチCustomer()を見ることができます。

于 2013-05-06T07:04:17.757 に答える