【问题标题】:Spring 4 RestController not mapping xml request correctlySpring 4 RestController 未正确映射 xml 请求
【发布时间】: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


【解决方案1】:
public Player getPlayer(Player requestEntity) { ... }

这是您的请求处理方法(此处省略 @RequestMapping 注释)。使用此方法,您可以对对象进行参数绑定。因此,如果您传递 URL /player/?id=2&amp;name=foo,那么 id 字段将获得值 2name 字段值 foo

但是你不想做绑定你想做消息转换。要启用此功能,您的方法参数必须使用 @RequestBody 进行注释,这将告诉 Spring MVC 不使用参数绑定,而是尝试检测合适的 HttpMessageConverter 以将 HTTP 消息正文转换为 Player 实例。

public Player getPlayer(@RequestBody Player requestEntity) { ... }

上面的签名应该可以解决您的问题。另请参阅reference guide,它很好地解释了这一点。

注意: @RestController@Controller@ResponseBody 的组合,它不会推断出 @RequestBody。请参阅reference guide

【讨论】:

    猜你喜欢
    • 2016-06-27
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多