【问题标题】:How to exclude root tag -element from jaxb wrapper?如何从 jaxb 包装器中排除根标记元素?
【发布时间】:2018-11-07 17:06:07
【问题描述】:

spring+jaxb+jpa上有app

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

@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>

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

休息控制器是:

@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));
    }

附: 我需要像这样做出响应xml:

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

【问题讨论】:

  • 您能否澄清一下“如何在没有标签的情况下做出响应?”的意思;应该如何回应?
  • @AngeloImmediate 已更新。
  • @AngeloImmediata 是的,但是有错误消息:org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class java.util.Collections$SingletonList
  • 所以,在 stackoverflow 我接受建议 - 使用包装器。
  • 我错了,所以我删除了我的评论......我会考虑你的问题,我会告诉你......对不起这个错误

标签: xml spring jaxb


【解决方案1】:

比较两个 xml(实际与所需),您不希望用户内容包含在 &lt;root&gt; 中。你可以这样做:

@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 结构应该匹配。注释有助于“平滑”差异。你有&lt;root&gt;&lt;/root&gt;,因为你的根类 UserWrapper 有这个注解:@XmlRootElement(name = "root")。如果名称中有“blah”,则外部标签 (&lt;root&gt;&lt;/root&gt;) 将是 &lt;blah&gt;&lt;/blah&gt;。此外,在您的用户列表上方,您有此注释:@XmlElementWrapper(name = "Users")。这使用提供的名称在列表元素之外创建了一个额外的包装器元素。

所以我所做的是正确命名根元素并删除额外的包装元素创建。

【讨论】:

  • @VladislavOsipenkov 我会用解释更新答案
猜你喜欢
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多