SpringMVC RequestMapping:将 .xml 添加到 xml 响应的控制器路径

SpringMVC RequestMapping: Adding .xml to controller path for xml response

/pets 产生 json 响应。我想使用 /pets.xml 来产生 xml 响应,同时在控制器上维护 @RequestMapping("pets") 。我可以使用

@RequestMapping("/index") 
@RequestMapping("/index.xml") 

作为解决方法,但这不是我要找的。

@RestController
@RequestMapping("pets")
class PetController {
  /*code*/
  @RequestMapping(produces = arrayOf("application/json"))
    fun findPetsJson(): List<PetDto> {
      return petService.findAll()
  }
  // this results in /pets/.xml for the xml response. I'm aiming for /pets.xml
  @RequestMapping(".xml", produces = arrayOf("application/xml"))
    fun findPetsXml(): List<PetDto> {
      return petService.findAll()
    }
  }

一个功能就够了。您只需要向它添加 arrayOf("application/json", "application/xml) 它就会同时产生两者(即使您删除它,它实际上也会产生两者,但它是这样明确的。

@RestController
@RequestMapping("pets")
class PetController {
  /*code*/
  @RequestMapping(produces = arrayOf("application/json", "application/xml), method = RequestMethod.GET)
    fun findPetsJson(): List<PetDto> {
      return petService.findAll()
  }
}

此代码允许在 /pets.json 和 /pets.xml

处进行询问

默认情况下,Spring MVC RequestMappingHandlerMapping 将为您的 @RequestMapping 注释方法(或 类)添加多个映射。它将在配置的旁边添加一个以 .* 结尾的,这样它也将匹配扩展名。

因此在您的情况下,/pets.xml 已被默认创建的 /pets.* 映射支持。您的 produces 现在仅根据 Accept 请求 header 限制接受请求。

默认情况下,文件扩展名优先于 Content-Type header。