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

时间:2015-01-05 21:38:45

标签: 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 properties, constructors and getters
}

这将生成以下JSON:

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

实体rel可以(当前)"用户"或者"角色"。当rel是"用户":

时,我希望产生以下JSON

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

当rel是"角色":

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

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

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

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

也应如上所示(&#34;用户&#34;或&#34;角色&#34;而不是&#34;实体&#34;)。

我使用JAXB for XML和Jackson for JSON。

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

使用Spring HATEOAS Project PermissionDto被重构为从ResourceSupport扩展的PermissionResource。这意味着PermissionResource可以由用户角色URI构成,这些URI依赖于正在使用的Permission Resource Assembler