我有下面的类:
public class MyDTO {
private String kiosk;
...
}
和以下URL:
http://localhost:1234/mvc/controllerUrl?kiosk=false
和以下控制器方法:
@RequestMapping(method = RequestMethod.GET, produces = APPLICATION_JSON)
@ResponseBody
public ResponseEntity<List<?>> getRequestSupportKludge(final MyDTO myDTO, BindingResult bindingResult) {
...
}
现在,它工作正常,布尔字段解析正确。
现在url参数已经改变成这样:
http://localhost:1234/mvc/controllerUrl?new_kiosk=false
我不想更改DTO中的参数名称。有没有办法说spring来理解new_kiosk
请求参数值应该放在kiosk
字段中?
3条答案
按热度按时间yks3o0rb1#
除了设置一个额外的setter之外,你还可以通过创建一个自定义参数解析器来处理这个问题。有几种方法可以实现这一点,但是已经有一个讨论得很好的post。如果我是你,我会把注意力集中在jkee的答案上。一步一步地遵循它,然后你所要做的就是用这样的东西来注解你的DTO:
请注意,即使你不能改变
MyDTO
类,你仍然可以遵循自定义解析器的路线。在这篇文章中,我回答了如何编写参数类型注解。结合这两篇文章,你可以很容易地想出一个注解,例如@ParamMapper
,它将定义从请求到属性的Map。pbossiut2#
有不同的方法来做到这一点。
如果你可以改变
MyDTO
类,最简单的方法是添加一个setter,如M.代努姆所建议的:这样,您就可以处理
http://localhost:1234/mvc/controllerUrl?kiosk=false
和http://localhost:1234/mvc/controllerUrl?new_kiosk=false
如果不允许这样做(因为DTO是不允许更改或...的库的一部分),则可以使用Map到
/mvc/controllerUrl
的过滤器,该过滤器将使用自定义HttpServlerRequestWrapper
Package 请求,该自定义HttpServlerRequestWrapper
将覆盖以下方法:调用底层请求方法并处理特殊参数名。示例:
这将更难编写和测试,所以只有在无法修改
MyDTO
类时才这样做。您也可以尝试使用
WebBindingInitializer
的自定义实现。WebBindingInitializer
接口的自定义实现,然后通过为AnnotationMethodHandlerAdapter
提供自定义Bean配置来启用该实现,从而覆盖默认配置。*注意:推荐的用法是为整个应用程序注册自定义编辑器--而不是你的用例。Spring框架经常被描述为 * 容易扩展但不容易覆盖 *。
摘要:尝试使用方法1,如果不能,则使用方法2,只有在有其他原因需要使用自定义
WebBindingInitializer
时才尝试方法3。syqv5f0l3#
如果请求中的字段名称与DTO中定义的字段不同,则可以在DTO的字段上使用
@JsonProperty
,以便将其Map到请求JSON。