如何从 jaxb 包装器中排除根标签元素?
How to exclude root tag -element from jaxb wrapper?
spring+jaxb+jpa
上有应用
所以,我休息了 - 控制器和 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));
}
P.S。
我需要这样回复 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>
比较两个 xml(实际与期望),您不希望 <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 启动应用程序来试用:
@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);
}
}
将return这个:
<Users>
<User>
<Name>name1</Name>
<Surname>surname1</Surname>
</User>
<User>
<Name>name2</Name>
<Surname>surname2</Surname>
</User>
</Users>
更新以回复评论(详细说明答案):
您的 POJO 和 xml 结构应该匹配。注释有助于 "smooth" 差异。你有 <root></root>
因为你的根 class UserWrapper 有这个注解:@XmlRootElement(name = "root")
。如果名称中有 "blah",则外部标签 (<root></root>
) 将是 <blah></blah>
。此外,在您的用户列表上方还有此注释:@XmlElementWrapper(name = "Users")
。这使用提供的名称在您的列表元素之外创建了一个额外的包装器元素。
所以我所做的是正确命名根元素并删除额外的包装元素创建。
spring+jaxb+jpa
上有应用所以,我休息了 - 控制器和 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));
}
P.S。 我需要这样回复 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>
比较两个 xml(实际与期望),您不希望 <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 启动应用程序来试用:
@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);
}
}
将return这个:
<Users>
<User>
<Name>name1</Name>
<Surname>surname1</Surname>
</User>
<User>
<Name>name2</Name>
<Surname>surname2</Surname>
</User>
</Users>
更新以回复评论(详细说明答案):
您的 POJO 和 xml 结构应该匹配。注释有助于 "smooth" 差异。你有 <root></root>
因为你的根 class UserWrapper 有这个注解:@XmlRootElement(name = "root")
。如果名称中有 "blah",则外部标签 (<root></root>
) 将是 <blah></blah>
。此外,在您的用户列表上方还有此注释:@XmlElementWrapper(name = "Users")
。这使用提供的名称在您的列表元素之外创建了一个额外的包装器元素。
所以我所做的是正确命名根元素并删除额外的包装元素创建。