11

我有以下课程:

public class MyDTO { 

       private String kiosk;
       ...
}

和以下网址:

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字段中?

4

2 回答 2

15

除了设置额外的设置器之外,您还可以通过制作自定义参数解析器来处理案例。有几种方法可以解决,但已经有一篇讨论得很好的帖子。如果我是你,我会专注于 jkee 的回答。一步一步地跟随它,你应该做的就是用类似的东西来注释你的 DTO,

public class MyDTO { 

       @ParamName("new_kiosk")
       private String kiosk;
       ...
}

请注意,即使您无法更改MyDTO课程,您仍然可以遵循自定义解析器路线。在这篇文章中,我已经回答了如何编写参数类型注释。结合这两篇文章,您可以轻松地提出一个注释,例如@ParamMapper定义从请求到属性的映射。想想类似的东西

 getRequestSupportKludge(@ParamMapper("new_kiosk;kiosk") MyDTO myDTO, BindingResult bindingResult)
于 2015-05-10T06:14:05.920 回答
4

有不同的方法可以做到这一点。

如果您可以更改MyDTO课程,最简单的方法是按照 M.Deinum 的建议添加一个设置器:

public class MyDTO { 

       private String kiosk;
       ...
       public void setNew_kiosk(String kiosk) {
           this.kiosk = kiosk;
       }
}

这样,您可以处理http://localhost:1234/mvc/controllerUrl?kiosk=false以及http://localhost:1234/mvc/controllerUrl?new_kiosk=false

如果您不允许这样做(因为 DTO 是您不允许更改的库的一部分或...),您可以使用映射到 的过滤器,这将使用将覆盖以下方法/mvc/controllerUrl的自定义包装请求HttpServlerRequestWrapper

String  getParameter(String name)
Map<String,String[]>    getParameterMap()
Enumeration<String>     getParameterNames()
String[]    getParameterValues(String name)

调用底层请求方法并处理特殊参数名称。例子 :

String[]    getParameterValues(String name) {
    String[] values = req.getParameterValues(name); // req is the wrapped request
    if ("kiosk".equals(name) && (values == null) {  // will accept both names
        values = req.getParameterValues("new_kiosk"); // try alternate name
    }
    return values;
}

这将更难编写和测试,所以只有在你不能修改MyDTO类时才这样做。

您也可以尝试使用WebBindingInitializer. 来自Spring Framework 参考手册

要外部化数据绑定初始化,您可以提供WebBindingInitializer接口的自定义实现,然后通过为 提供自定义 bean 配置来启用它AnnotationMethodHandlerAdapter,从而覆盖默认配置。

注意:推荐的用法是为整个应用程序注册自定义编辑器 - 而不是您的用例。Spring Framework 通常被描述为易于扩展但不易覆盖。买者自负 ...

总结:尝试使用方法1,如果不能,则使用方法2,如果您有其他原因使用自定义,请仅尝试方法3WebBindingInitializer

于 2015-05-10T08:28:14.627 回答