根据对象属性动态定义 XML 标签

Defining XML tag dynamically based on object property

我就是想不通这个。

我有一个名为 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 可以是(当前)"users" 或 "roles"。当 rel 为 "users":

时,我想要生成以下 JSON

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

当 rel 为 "roles":

   {
       "roles":
       {
           "rel": "roles",
           "href": ...
       }
    }

无需创建一个 UserPermissionDto 和另一个 RolePermissionDto,因为它们除了这个属性外完全相同。我可以做 entity.getRel() 来了解 Link.

的 rel

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

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

也应如上所示表示("users" 或 "roles" 而不是 "entity")。

我将 JAXB 用于 XML,将 Jackson 用于 JSON。

非常感谢任何帮助。

谢谢

我不确定这是否适用于 JSON 但试试 @XmlElements:

@XmlElements({
    @XmlElement(name="users", type=Users.class),
    @XmlElement(name="roles", type=Roles.class)
}
public Link entity;

这假设 UsersRoles 扩展 Link。在这种情况下,根据您的对象是否具有 UsersRoles 的实例,您将获得 usersroles 元素名称。不确定 JSON。

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

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

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

通过使用 Spring HATEOAS Project PermissionDto was refactored to a PermissionResource which extends from ResourceSupport. This means a PermissionResource can be composed with either user or role URIs dependending on which Permission Resource Assembler 正在使用中。