Иерархия в типе EntityHolder Джерси - PullRequest
2 голосов
/ 29 мая 2011
@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 при втором использовании.

Есть идеи, почему? Разве Джерси не должен приводить сущность к тому типу, который я объявляю? Возможна ли даже иерархия в этом случае?

Спасибо, Уди

1 Ответ

1 голос
/ 29 мая 2011

У вас проблема с аннотациями JAXB: и InteractionRequest, и InteractionChatRequest помечены @XmlRootElement(name = "request"). Таким образом, они имеют одинаковый корневой элемент, что делает невозможным для JAXB различать их.

Попробуйте изменить InteractionChatRequest на @XmlRootElement(name = "chat-request").

...