0

REST-API を提供するために、JaxB と Jackson で JAX-RS (CXF) を使用しています。残念ながら、見つかった結果はどれも次の(単純な)問題に役立ちません:

次の方法を実装しました。

@POST
@Path(ApiStatics.ARMY_CREATE_ARMY)
public com.empires.web.dto.Army createArmy(@FormParam("locationid") long locationId, @FormParam("name") String name, @FormParam("troops") ArmyTroops troops) {

ここに私のモデルクラスがあります:

@XmlRootElement
@XmlSeeAlso(ArmyTroop.class)
public class ArmyTroops {

    public ArmyTroops() {
    }

    public ArmyTroops(List<ArmyTroop> troops) {
        this.troops = troops;
    }

    @XmlElement(name = "troops")
    private List<ArmyTroop> troops = new ArrayList<ArmyTroop>();

    public List<ArmyTroop> getTroops() {
        return troops;
    }

    public void setTroops(List<ArmyTroop> troops) {
        this.troops = troops;
    }
}

陸軍部隊

@XmlRootElement(name = "troops")
public class ArmyTroop {

    @XmlElement
    private long troopId;

    @XmlElement
    private String amount;

    public long getTroopId() {
        return troopId;
    }

    public void setTroopId(long troopId) {
        this.troopId = troopId;
    }

    public String getAmount() {
        return amount;
    }  

    public void setAmount(String amount) {
        this.amount = amount;
    }
}

私が送信する私のjsonは次のようになります:

locationid  1
name    asdasd
troops  {"troops":[{"troopId":4,"amount":"5"},{"troopId":6,"amount":"5"}]}

残念ながら、オブジェクトは変換されません。代わりに、次のエラーが表示されます。

InjectionUtils #reportServerError - Parameter Class com.empires.web.dto.in.ArmyTroops has no constructor with single String parameter, static valueOf(String) or fromString(String) methods

コンストラクターに 1 つの文字列パラメーターを指定すると、前述のように "軍隊" の json 文字列全体が渡されます。

この時点で JaxB が機能しない理由はありますか?

4

1 に答える 1

0

@Form アノテーションを使用してすべてのパラメーターを渡しています。ただし、http メッセージの Form 部分は xml データ構造でなければなりません。3 つのパラメーターにはメインの xml データ構造がないため、機能しません。つまり、フォーム パラメータはボディとして送信されます。Cxf は、MultivaluedMap を使用してパラメーターを送信します (cxf には、この構造の xml モデルがあります)。ご覧のとおり、単純にシリアル化できないパラメーターには適していません。

ここでの解決策は、問題を回避するために @FormParam を削除することです。

1) @PathParam @CookieParam を使用して、最初の 2 つのパラメーターを送信し、「タグなし」(本文) は軍隊の構成のみに送信します。

2) すべてのパラメーターを受け取り、xml データ構造としてシリアル化できる uber オブジェクトを定義し、「タグなし」(本文) 送信を使用します。

3) 石鹸を使用します。cxf を使用すると、Rest と SOAP の両方を簡単に取得できます。

于 2013-07-06T08:53:31.870 に答える