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));
}
答案 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")
。这样会在列表元素之外使用提供的名称创建一个额外的包装器元素。
所以我要做的就是正确命名根元素,并删除多余的包装器元素创建。