【发布时间】:2017-05-08 10:17:12
【问题描述】:
我正在尝试制作一个宁静的 Web 服务,它接受 XML 请求并产生 xml 响应,我正在使用 spring 4.3.5...
问题是,当我使用邮递员发布发布请求并在我的服务方法中添加调试时,我发现 xml 请求属性没有与播放器 POJO 映射/反序列化。
任何帮助将不胜感激..谢谢
@RestController
public class SyncRestfulService {
LoggerManager loggerManager = new LoggerManager();
@RequestMapping(value = RestURIConstants.SAMPLE_POST_PLAYER, method = RequestMethod.POST, headers = {
"Content-type=application/xml" })
public Player getPlayer(Player requestEntity) {
loggerManager.info(LoggerConstantEnum.SyncRestfulService ,
"| <AbilitySyncRestfulService> Method: getPlayer " + requestEntity);
loggerManager.info(LoggerConstantEnum.SyncRestfulService , "Id : ", requestEntity.getId());
return requestEntity;
}
}
请求xml数据
//Request
<player>
<id>1</id>
<matches>251</matches>
<name>Anand</name>
</player>
//response xml data
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<player>
<id>0</id>
</player>
//jaxb pojo
@XmlRootElement(name = "player")
@XmlAccessorType(XmlAccessType.NONE)
public class Player {
private int id;
private String name;
private String matches;
public int getId() {
return id;
}
@XmlElement(name = "id")
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
@XmlElement(name = "name")
public void setName(String name) {
this.name = name;
}
public String getMatches() {
return matches;
}
@XmlElement(name = "matches")
public void setMatches(String matches) {
this.matches = matches;
}
}
【问题讨论】:
-
在您的控制器中添加产生 = { MediaType.APPLICATION_XML_VALUE }
-
你有配置 bean 以在 application-context.xml 文件中将 XML 转换为 POJO,反之亦然
-
如果我错了,请纠正,我认为在 spring 4 中我们不需要添加转换器。及其正确生成 XML 我已经测试过了,但如果问题是将 post body xml 字符串映射到“Playter player”
-
它实际上按设计工作...这里的主要问题是您忘记了控制器方法中
Player参数上的@RequestBody注释。 Spring 现在只是创建一个新实例来进行参数绑定,但是由于您没有在 url(或作为表单)中传递参数,因此不会绑定任何内容。您实际上将 XML 作为正文传递,您需要指示 spring 为其进行封送处理(而不是绑定)。 -
@AnandKushwaha
@RestController是@Controller和@ResponseBody不是@RequestBody的组合。请参阅docs.spring.io/spring/docs/current/spring-framework-reference/…(仅对此进行了解释)。
标签: xml spring-mvc spring-restcontroller