我正在使用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在這一點上不工作的任何想法?
嘿謝謝你的答案,但你是什麼意思機智「無標籤」的身體?你對第3點意味着什麼? – goosefraba
如果用cxf rest將一個方法聲明爲「createArmy(ArmyTroops troops)」。那麼ArmyTroops必須作爲http請求的主體發送。由於在參數上沒有註釋,所以我稱之爲「無標籤」。通過使用肥皂我只是說,使用jaxws。只需將@WebParam放入每個參數,並聲明一個jaxws:endpoint。在工作中,我們用兩種方式註釋每個Web服務,並讓用戶在休息/肥皂之間進行選擇。 – Galigator