泽西岛的EntityHolder类型中的层次结构

时间:2011-05-29 12:14:49

标签: java jaxb jersey jax-rs

@XmlRootElement(name = "request")
@XmlAccessorType(XmlAccessType.FIELD)
@JSONConfigurable
public class InteractionRequest {
    @XmlElement(name = "skill")
    protected String skillName;
}

@XmlRootElement(name = "request")
@XmlAccessorType(XmlAccessType.FIELD)
@JSONConfigurable
public class InteractionChatRequest extends InteractionRequest {
    @XmlElement
    @XmlJavaTypeAdapter(LPStringsXmlAdapter.class)
    @XmlElementWrapper(name = "preChatLines")
    protected List<String> line;
}

和2个用法:

@PUT
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response postExitSurvey(EntityHolder<InteractionRequest> ent) {
    InteractionRequest request = ent.getEntity();
    return null;
}

@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response interactionRequest(EntityHolder<InteractionChatRequest> ent) {  
    InteractionChatRequest params = ent.getEntity();
    return null;
}

现在,在这两种情况下,实体持有者都持有InterationRequest对象,这会在第二次使用中导致ClassCastException。

知道为什么吗?泽西不应该将实体投射到我声明的类型吗? 在这种情况下,层次结构是否可能?

谢谢, UDI

1 个答案:

答案 0 :(得分:1)

您遇到了JAXB注释问题:InteractionRequestInteractionChatRequest都注明了@XmlRootElement(name = "request")。因此它们具有相同的根元素,这使得JAXB无法区分它们。

尝试将InteractionChatRequest更改为@XmlRootElement(name = "chat-request")