我正在使用JAX-RS(CXF)与JaxB和Jackson一起提供REST-API。 不幸的是,没有找到的结果可以帮助我解决(简单)问题:
我实施了以下方法:
@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 :(得分:0)
您正在使用@Form注释传递所有参数。 但http消息的Form部分必须是xml数据结构。 您的3个参数没有主xml数据结构,因此它不起作用。 简而言之,形式参数作为正文发送。 Cxf使用MultivaluedMap发送params(cxf有一个xml模型用于此结构)。 正如您所看到的,它不适用于无法按顺序进行序列化的参数。
在这里,我解决方案是放弃@FormParam以避免问题:
1)使用@PathParam @CookieParam向你的前2个参数发送,并且仅为军队组合发送'no tag'(正文)。
2)定义一个带有所有参数的超级对象,可以序列化为xml数据结构,并使用“无标记”(正文)发送。
3)使用肥皂,使用cxf,它很容易得到休息和肥皂。