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

问题描述 投票:0回答:2

我正在使用@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"}
]

但是当“ Content-Type”设置为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")之类的注释,但是没有运气。

java spring-boot jackson2 jackson-dataformat-xml
2个回答
0
投票

通常使用@XmlElementWrapper是一个好方法。但这仅在列表位于实体内部时有效。

我建议不要返回List<User>,而应返回一个具有Users属性的users实体(注意复数)。由于实体本身就是元素包装器,因此我们甚至可以在此处省略@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>

0
投票

根级别的集合对xml映射器的支持是有限的,但是完全支持集合作为pojo属性。因此,对于定制而言,最好创建一个包装器。

还请注意@JsonView(UserView.Summary.class)到wrapper属性,以供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>
© www.soinside.com 2019 - 2024. All rights reserved.