将休息端点中的 Spring 数据 Jpa 投影编组到 xml 会产生奇怪的标签

Marshalling a Spring Data Jpa Projection in a rest endpoint to xml produces strange tags

编组 spring 数据 jpa 投影时,xml 结构无效。代理显示为根 xml 标记,而不是投影接口 class 名称。然而 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();
}

rest端点的响应显示(我们需要application/xml):

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

代理标记中的数字正在更改。我希望有一个带有接口名称或 @XmlRootElement(name = "user-short") 注释的根标记,如下所示:

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

我们在项目中使用基于接口的 Spring Data JPA 投影。现在我们想在 REST 端点中使用它,而不公开存储库。所以我们不能使用 Spring Data Rest 投影。由于嵌套投影,我们也不能使用基于 class 的投影。 JSON 输出看起来像预期的那样,但 xml 输出将代理 class 写入根标记。并且所有 XML-注释都被忽略(枚举不会转换为序数等)。

在调试器中,当我打开接口类型 UserShort 的变量时,我看到一个类型 com.sun.proxy.Proxy 的实例,一些反射的东西。 UserShort.

没有实现

告诉编组器使用来自界面的信息而不是 spring 引导中的反射内容的首选方法是什么?

感谢您的帮助

JAXB 规范不支持您的尝试:

The mapping of existing Java interfaces to schema constructs is not supported. Since an existing class can implement multiple interfaces, there is no obvious mapping of existing interfaces to XML schema constructs.

所以你应该在 Spring 数据

上使用基于 Class 的投影 (DTO)