2015-04-10 8 views
0

Я делаю очень простую вещь, которая должна просто работать, ИМО. У меня есть такой ресурс, как:Возвращающиеся суперклассы с ресурса Джерси

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("{nodeType}/{uuid}") 
public Object getResourceInfo(@PathParam("nodeType") String nodeType, 
           @PathParam("uuid") String uuid, 
           @Context SecurityContext authority) { ... 

Примечание. Я возвращаю объект типа. Это связано с тем, что в зависимости от вызова (здесь, в зависимости от аргумента nodeType) я хочу вернуть другой конкретный класс (который всегда будет @XmlRootElement), и он будет выведен в ответ.

Однако это не работает. Я получаю исключение, как:

Exception Description: A descriptor for class com.mycompany.XmlElementTypeInstance was not found in the project. For JAXB, if the JAXBContext was bootstrapped using TypeMappingInfo[] you must call a marshal method that accepts TypeMappingInfo as an input parameter. 

Если я меняю объект на один подкласс, он работает. Но я хочу, чтобы он мог обрабатывать любой подкласс, XmlElementTypeInstance, XmlElementTypeInstance2, etcetc.

Я попытался создать общий интерфейс, из которого все подклассы XmlElementTypeInstance выводятся, но тогда я получаю только эти свойства в интерфейсе, а не дополнительные свойства в подклассах. Игра с @XmlElementRef и добавление всех возможных свойств к общему интерфейсу чрезвычайно уродлива и не может работать корректно, чтобы генерировать JSON, я хочу, поэтому, пожалуйста, не предлагайте этого. =)

Есть ли способ сделать это? Это похоже на простую, базовую, необходимую функциональность ... любые другие рамки REST, которые я использовал, не проблема ...

+0

Я рекомендую возвращать 'String' и анализировать объект вручную или возвращать' Map ', который представляет данные, которые вы хотите/должны выставить. –

+0

Если я делаю что-либо из этого, я мог бы также вытащить Джерси на бордюр и просто написать JSONObject сам и манипулировать объектами ответа контейнера на низком уровне. Нет, это не ответ. Я хочу отображать объекты JAXB. – BadZen

+0

Хорошо, тогда добро пожаловать в одну из головных бонусов/ограничений JAXB. –

ответ

2

Решение получилось простым (пришлось читать JSR вместо фактических документов Dodge, однако!)

Вместо того, чтобы возвращать объект, возвращающий ответ (раздел 3.3.3 JSR 339) с объектом, установленным в качестве объекта, заставляет реализацию выбрать подходящее MessageBody {Writer, Reader} во время выполнения.

return Response.ok().entity(<the object>).build(); 

Потеряно слишком много времени на этом. Надеюсь, это поможет кому-то позже. =/