在Spring Boot中使用@JsonView时自定义Jackson XML输出



我正在使用@JsonView注释输出Spring MVC中复杂对象的简化版本。

视图:

public class UserView {
public interface Summary {}
}

实体类:

public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "name", length = 255)
@JsonView(UserView.Summary.class)
private String name;

资源方法:

@GetMapping(value = "users", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
@JsonView(UserView.Summary.class)
public List<User> getAllUsers() {
return userRepository.findAllBy();
}

这在输出JSON:时非常有效

[
{"name": "User 1"},
{"name": "User 2"}
]

但是,当"内容类型"设置为XML时,将返回以下输出:

<List>
<item>
<name>User 1</name>
</item>
<item>
<name>User 2</name>
</item>
</List>

我想用<Users>代替<List>,用<User>代替<item>,但我找不到更改这些通用名称的方法。我尝试过@XmlRootElement(name="user")@XmlElementWrapper(name="users")之类的注释,但没有成功。

使用@XmlElementWrapper通常是一种很好的方法。但只有当列表位于实体内部时,这才有效。

我建议不要返回List<User>,而是返回属性为usersUsers实体(注意复数(。我们甚至可以省略这里的@XmlElementWrapper,因为实体本身就是元素包装器。

@XmlRootElement
public class Users implements Serializable {
private static final long serialVersionUID = 1337L;
@XmlElement(name = "User")
private List<User> users = new ArrayList<>();
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}

输出

<Users>
<User>
<name>User 1</name>
</User>
<User>
<name>User 2</name>
</User>
</Users>

根级别的集合对xml映射器的支持是有限的(请参阅此处和此处(答案不太过时,但您应该了解(,但完全支持作为pojo属性的集合。因此,对于自定义,最好创建一个包装器。

还要注意@JsonView(UserView.Summary.class(到spring的包装器属性以获取它。

类似的东西

@JacksonXmlRootElement(localName = "Users")
public class CollectionWrapper {
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName = "User")
@JsonView(UserView.Summary.class)
private List<User> users;
public CollectionWrapper(List<User> users) {
this.users = users;
}
}

资源

@GetMapping(value = "users", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE})
@JsonView(UserView.Summary.class)
public CollectionWrapper getAllUsers() {
return new CollectionWrapper(userRepository.findAllBy());
}

输出

<Users>
<User>
<name>User 1</name>
</User>
<User>
<name>User 2</name>
</User>
</Users>

最新更新