Как вы маршируете параметризованный тип с JAX-WS / JAXB? - PullRequest
2 голосов
/ 17 февраля 2010

Рассмотрим следующие классы (пожалуйста, предположим, что публичные методы get и set для приватных полей).

// contains a bunch of properties
public abstract class Person { private String name; }

// adds some properties specific to teachers
public class Teacher extends Person { private int salary; }

// adds some properties specific to students
public class Student extends Person { private String course; }

// adds some properties that apply to an entire group of people
public class Result<T extends Person> {
   private List<T> group;

   private String city;
   // ...
}

У нас может быть следующая реализация веб-сервиса, аннотированная следующим образом:

@WebService
public class PersonService {

    @WebMethod
    public Result<Teacher> getTeachers() { ... }

    @WebMethod
    public Result<Student> getStudents() { ... }
}

Проблема в том, что JAXB отображает объект Result как Result<Person> вместо конкретного типа. Таким образом, результат, возвращаемый getTeachers (), сериализуется как содержащий List<Person> вместо List<Teacher>, так же как и getStudents (), mutatis mutandis.

Это ожидаемое поведение? Нужно ли использовать @XmlSeeAlso для Персона?

Спасибо!

LES

1 Ответ

0 голосов
/ 20 февраля 2010

Ответ на этот вопрос был довольно сложным. Оказывается, что версия jettison, используемая плагином jax-ws json, немного устарела (1.0-beta-1 IIRC). Эта конкретная версия плохо справляется с этим делом (она вылетает). Если вы добавите @XmlSeeAlso, то маршаллинг JSON потерпит крах! Конечно, это отстой!

Я читал на каком-то форуме (нет ссылки - это все из памяти), что плагин jax-ws json активно не поддерживается. Если вы попытаетесь 1) исключить стандартную зависимость jettison из зависимости jax-ws json (при условии, что здесь используется maven) и добавить более новую версию, вы получите сообщение об отсутствии JSONException Jax-ws json НЕ будет работать с более новой версией Jettison (я пытался).

Это задокументировано на другом сайте (кто-то заявил, что он хотел бы, чтобы кто-то перенес jax-ws json на последнюю версию).

В конце концов я переключился на DWR для удаленного взаимодействия. JAX-WS лучше всего подходит для межсистемной (серверной) интеграции. Он слишком тяжелый для фронтэнда. DWR в этом случае работает УДИВИТЕЛЬНО.

Нашел ссылку на форум, который я прочитал: http://forums.java.net/jive/thread.jspa?messageID=384385. Обратите внимание, что Collab.net в настоящее время недоступен для технического обслуживания, но они скоро вернутся.

Что касается ответа на общий вопрос (без части плагина JAX-WS JSON), ответ - да - вы должны использовать аннотацию @XmlSeeAlso в классе Person. В противном случае схема будет содержать только элементы Person, а не Teacher или Student. Только элементы, определенные в Person, маршалируются без аннотации @XmlSeeAlso.

...