Вычисление Jpa-проекции Spring Data в конечной точке отдыха до xml приводит к странным тегам - PullRequest
1 голос
/ 27 февраля 2020

При маршалинге проекции jpa данных пружины структура xml недопустима. Прокси отображается как тег root xml, а не как имя класса интерфейса проекции. Вывод JSON, однако, в порядке, но остальной клиент во внешней системе не понимает json.

Сущность выглядит как этот пример - реальная сущность более сложна:

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String surname;
    private String city;
    private int age;
    // getters, setters, ...
}

Интерфейс проекции выглядит следующим образом:

@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "user-short")
public interface UserShort {
    String getName();
    String getCity();
}

Ответ от остальной конечной точки показывает (нам нужно приложение / xml):

<.Proxy253>
  <name>Alexander</name>
  <city>Alexandria</city>
</.Proxy253>

Число в теге прокси меняется. Я ожидал бы тег root с именем интерфейса или аннотацию @XmlRootElement(name = "user-short"), подобную этой:

<user-short>
  <name>Alexander</name>
  <city>Alexandria</city>
</user-short>

Мы используем проекцию Spring Data JPA на основе интерфейса в нашем проекте. Теперь мы хотим использовать его в конечной точке REST, без открытых репозиториев. Поэтому мы не можем использовать прогнозы Spring Data Rest. Из-за вложенных прогнозов мы также не можем использовать прогнозы на основе классов. Вывод JSON выглядит ожидаемым, но вывод xml записывает прокси-класс в виде тега root. И все XML -аннотации игнорируются (перечисления не преобразуются в ординалы и т. Д. c.).

В отладчике, когда я открываю переменную типа интерфейса UserShort Я вижу экземпляр типа com.sun.proxy.Proxy, некоторые вещи отражения. Нет реализации UserShort.

Какой предпочтительный способ сказать маршаллеру использовать информацию из интерфейса, а не информацию об отражении в весенней загрузке?

Спасибо за любую помощь

1 Ответ

1 голос
/ 27 февраля 2020

То, что вы пытаетесь, не поддерживается JAXB spe c:

Сопоставление существующих Java интерфейсов с конструкциями схемы не поддерживается. Поскольку существующий класс может реализовывать несколько интерфейсов, нет очевидного сопоставления существующих интерфейсов с XML конструкциями схемы.

Поэтому вы должны использовать проекции на основе классов (DTO) в Spring Data

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...