JAX-RS - 使用JaxB对象的JSON列表

时间:2013-07-05 20:48:35

标签: json rest jaxb cxf jax-rs

我正在使用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在这一点上不起作用的任何想法?

1 个答案:

答案 0 :(得分:0)

您正在使用@Form注释传递所有参数。 但http消息的Form部分必须是xml数据结构。 您的3个参数没有主xml数据结构,因此它不起作用。 简而言之,形式参数作为正文发送。 Cxf使用MultivaluedMap发送params(cxf有一个xml模型用于此结构)。 正如您所看到的,它不适用于无法按顺序进行序列化的参数。

在这里,我解决方案是放弃@FormParam以避免问题:

1)使用@PathParam @CookieParam向你的前2个参数发送,并且仅为军队组合发送'no tag'(正文)。

2)定义一个带有所有参数的超级对象,可以序列化为xml数据结构,并使用“无标记”(正文)发送。

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