Java 基于对象属性动态定义XML标记

Java 基于对象属性动态定义XML标记,java,json,jaxb,Java,Json,Jaxb,我就是想不起这件事 我有一个名为PermissionDto的对象: @XmlRootElement(name = "permission") @XmlAccessorType(FIELD) public class PermissionDto implements Serializable { private static final long serialVersionUID = 1L; private Link entity; ... some other pr

我就是想不起这件事

我有一个名为PermissionDto的对象:

@XmlRootElement(name = "permission")
@XmlAccessorType(FIELD)
public class PermissionDto implements Serializable {

    private static final long serialVersionUID = 1L;

    private Link entity;

    ... some other properties, constructors and getters
}

这将生成以下JSON:

   {
       "entity":
       {
           "rel": "users",
           "href": ...
       }
    }

实体rel可以(当前)为“用户”或“角色”。当rel为“users”时,我希望生成以下JSON:

当rel为“角色”时:

无需创建UserPermissionDto和另一个RolePermissionDto,因为它们除了此属性外完全相同。我可以执行entity.getRel()以了解链接的rel

请注意,我的服务器还可以生成这些响应的XML表示,这意味着响应的标记

<entity rel="users" href="http://localhost:8080/users/1"/>


还应如上所述表示(可以是“用户”或“角色”,而不是“实体”)

我使用JAXB表示XML,Jackson表示JSON

非常感谢您的帮助


谢谢

我不确定这是否适用于JSON,但请尝试
@XmlElements

@XmlElements({
    @XmlElement(name="users", type=Users.class),
    @XmlElement(name="roles", type=Roles.class)
}
public Link entity;
这假定
用户
角色
扩展
链接
。在这种情况下,根据对象是否具有
用户
角色
的实例,您将获得
用户
角色
元素名称。不确定JSON


很可能这只适用于集合属性。

我们实际上将问题颠倒过来,找到了更好的解决方案

我们决定尝试以完整的HATEOAS方式实现我们的API。这样,用户和角色只不过是指向这些特定实体的链接


通过使用PermissionTo,它被重构为从ResourceSupport扩展而来的PermissionResource。这意味着PermissionResource可以由用户或角色URI组成,具体取决于所使用的URI。

检查
@XmlElements
,它允许根据类型(可能是您的情况)使用不同的元素名称。不确定它是否适用于JSON,但值得一试。嘿@lexicore,不幸的是,事实并非如此。用户和角色不扩展链接,而是通过将其类型作为rel和id转换为Link来形成href(这将保持域对象与与与客户端通信的DTO对象分开)。只需添加到我之前的评论中:用户和角色甚至不共享一个共同的超类在新的实现上工作。这是一个巨大的帮助,谢谢你。
<entity rel="users" href="http://localhost:8080/users/1"/>
@XmlElements({
    @XmlElement(name="users", type=Users.class),
    @XmlElement(name="roles", type=Roles.class)
}
public Link entity;