如何从jaxb包装器中排除root标记-element?

时间:2018-11-07 17:06:07

标签: xml spring jaxb

spring + jaxb + jpa上有一个应用程序

所以,我休息了-控制器和jaxv元素:

Check that version is changed to <version>5.1.6</version> from <scope>runtime</scope>

有用于包含用户列表的用户实体和包装器。

我的控制器的响应是:

@AllArgsConstructor
@NoArgsConstructor
@XmlRootElement(name = "root")
@Getter
public class UserWrapper {
    @XmlElementWrapper(name = "Users")
    @XmlElement(name = "User")
    private List<User> Users;

    @XmlElement(name="UserError")
    private UserError error;
}


@Getter
@Setter
@XmlRootElement(name="User")
@NoArgsConstructor
public class User{
  @XmlElement
  private String name;
  @XmlElement
  private String surname;
}

如何在没有标签的情况下做出回应?

其他控制者是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <Users>
        <User>
            <Name>AAA</Name>
            <Surname>AAA</Surname>
        </User>
        <User>
            <Name>BBB</Name>
            <Surname>BBB</Surname>
        </User>
    </Users>
</root>

P.S。 我需要像这样制作响应XML:

@RequestMapping(value = "/users", method = RequestMethod.GET)
    public @ResponseBody UsersWrapper findByParams(
            @RequestParam(value = "id") String id) throws Exception {
        RiskMetricError error = null;
        List<User> users = userService.find(id);

        return (new UsersWrapper(users, error));
    }

1 个答案:

答案 0 :(得分:3)

比较两个xml(实际vs期望),您不希望在<root>中包含用户内容。您可以这样做:

@XmlRootElement(name = "Users")
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Users {

    @XmlElement(name = "User")
    private List<User> users;
}

那么用户将是:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

    @XmlElement(name = "Name")
    private String name;
    @XmlElement(name = "Surname")
    private String surname;
}

一个小的Spring Boot应用程序可以尝试:

@RestController
public class UsersEndpoint {

    @GetMapping("/users")
    public Users getUsers() {
        List<User> users = new ArrayList<>();
        users.add(new User("name1", "surname1"));
        users.add(new User("name2", "surname2"));

        return new Users(users);
    }
}

将返回此:

<Users>
    <User>
        <Name>name1</Name>
        <Surname>surname1</Surname>
    </User>
    <User>
        <Name>name2</Name>
        <Surname>surname2</Surname>
    </User>
</Users>

更新以回复评论(详细说明答案):

您的POJO和您的xml结构应该匹配。注释有助于“平滑”差异。您之所以拥有<root></root>是因为您的根类UserWrapper具有以下注释:@XmlRootElement(name = "root")。如果您的名字叫“ blah”,则外部标签(<root></root>)将为<blah></blah>。此外,在用户列表上方,您具有以下注释:@XmlElementWrapper(name = "Users")。这样会在列表元素之外使用提供的名称创建一个额外的包装器元素。

所以我要做的就是正确命名根元素,并删除多余的包装器元素创建。