2013-07-05 51 views
0

我正在使用JAX-RS(CXF)與JaxB和Jackson一起提供REST-API。 不幸的是,沒有一個找到的結果幫我用下面的(簡單的)問題:JAX-RS - JSON List to Object with JaxB

我實現了以下方法:

@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; 
    } 
} 

ArmyTroop

@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 

如果我提供一個字符串參數構造函數中,我獲得通過整個JSON字符串爲「軍隊」,如上所述。

JaxB在這一點上不工作的任何想法?

回答

0

您正通過@Form註釋傳遞所有參數。 但是,http消息的表單部分必須是xml數據結構。 你的3個參數沒有主要的xml數據結構,所以它不會工作。 總之,表單參數是作爲body發送的。 Cxf使用多值映射發送參數(cxf在此結構中有一個xml模型)。正如你所看到的,它不適合不能被trivally序列化的參數。

這裏我的解決辦法是刪除@FormParam來避免此問題:

1)使用@PathParam @CookieParam到你的發前2個參數,以及「無標籤」(體)只爲軍隊成分。

2)定義一個超級對象,它可以接受所有參數,並可以序列化爲xml數據結構並使用'no tag'(body)發送。

3)使用肥皂,與cxf它是真的很容易得到休息和肥皂。

+0

嘿謝謝你的答案,但你是什麼意思機智「無標籤」的身體?你對第3點意味着什麼? – goosefraba

+0

如果用cxf rest將一個方法聲明爲「createArmy(ArmyTroops troops)」。那麼ArmyTroops必須作爲http請求的主體發送。由於在參數上沒有註釋,所以我稱之爲「無標籤」。通過使用肥皂我只是說,使用jaxws。只需將@WebParam放入每個參數,並聲明一個jaxws:endpoint。在工作中,我們用兩種方式註釋每個Web服務,並讓用戶在休息/肥皂之間進行選擇。 – Galigator