Spring 4 RestController 未正确映射 xml 请求
Spring 4 RestController not mapping xml request correctly
我正在尝试制作一个 restful Web 服务,它接受 XML 请求并产生 xml 响应,我正在使用 spring 4.3.5为此...
问题是,当我 post 使用 postman 发出 post 请求并在我的服务方法中添加调试时,我发现 xml播放器 POJO 的请求属性不 mapping/deserialize。
任何帮助将不胜感激..谢谢
@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;
}
}
public Player getPlayer(Player requestEntity) { ... }
这是您的请求处理方法(此处省略@RequestMapping
注释)。使用此方法,您可以对对象进行参数绑定。因此,如果您要传递 URL /player/?id=2&name=foo
,则 id
字段将获得值 2
和 name
字段值 foo
。
但是你不想做绑定你想做消息转换。要启用此功能,您的方法参数必须用 @RequestBody
注释,这将告诉 Spring MVC 不要使用参数绑定,而是尝试检测合适的 HttpMessageConverter
以将 HTTP 消息正文转换为 Player
实例。
public Player getPlayer(@RequestBody Player requestEntity) { ... }
上面的签名应该可以解决您的问题。另请参阅 reference guide,它很好地解释了这一点。
注: @RestController
是@Controller
和@ResponseBody
的组合,并不推导出@RequestBody
。见 reference guide.
问题是,当我 post 使用 postman 发出 post 请求并在我的服务方法中添加调试时,我发现 xml播放器 POJO 的请求属性不 mapping/deserialize。
任何帮助将不胜感激..谢谢
@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;
}
}
public Player getPlayer(Player requestEntity) { ... }
这是您的请求处理方法(此处省略@RequestMapping
注释)。使用此方法,您可以对对象进行参数绑定。因此,如果您要传递 URL /player/?id=2&name=foo
,则 id
字段将获得值 2
和 name
字段值 foo
。
但是你不想做绑定你想做消息转换。要启用此功能,您的方法参数必须用 @RequestBody
注释,这将告诉 Spring MVC 不要使用参数绑定,而是尝试检测合适的 HttpMessageConverter
以将 HTTP 消息正文转换为 Player
实例。
public Player getPlayer(@RequestBody Player requestEntity) { ... }
上面的签名应该可以解决您的问题。另请参阅 reference guide,它很好地解释了这一点。
注: @RestController
是@Controller
和@ResponseBody
的组合,并不推导出@RequestBody
。见 reference guide.