spring 是否在DTO中自定义Map请求参数和字段?

hts6caw3  于 2022-10-30  发布在  Spring
关注(0)|答案(3)|浏览(193)

我有下面的类:

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

yks3o0rb

yks3o0rb1#

除了设置一个额外的setter之外,你还可以通过创建一个自定义参数解析器来处理这个问题。有几种方法可以实现这一点,但是已经有一个讨论得很好的post。如果我是你,我会把注意力集中在jkee的答案上。一步一步地遵循它,然后你所要做的就是用这样的东西来注解你的DTO:

public class MyDTO { 

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

请注意,即使你不能改变MyDTO类,你仍然可以遵循自定义解析器的路线。在这篇文章中,我回答了如何编写参数类型注解。结合这两篇文章,你可以很容易地想出一个注解,例如@ParamMapper,它将定义从请求到属性的Map。

getRequestSupportKludge(@ParamMapper("new_kiosk;kiosk") MyDTO myDTO, BindingResult bindingResult)
pbossiut

pbossiut2#

有不同的方法来做到这一点。
如果你可以改变MyDTO类,最简单的方法是添加一个setter,如M.代努姆所建议的:

public class MyDTO { 

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

这样,您就可以处理http://localhost:1234/mvc/controllerUrl?kiosk=falsehttp://localhost:1234/mvc/controllerUrl?new_kiosk=false
如果不允许这样做(因为DTO是不允许更改或...的库的一部分),则可以使用Map到/mvc/controllerUrl的过滤器,该过滤器将使用自定义HttpServlerRequestWrapper Package 请求,该自定义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的自定义实现。

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

注意:推荐的用法是为整个应用程序注册自定义编辑器--而不是你的用例。Spring框架经常被描述为 * 容易扩展但不容易覆盖 *。
摘要:尝试使用方法1,如果不能,则使用方法2,只有在有其他原因需要使用自定义WebBindingInitializer时才尝试方法3。

syqv5f0l

syqv5f0l3#

如果请求中的字段名称与DTO中定义的字段不同,则可以在DTO的字段上使用@JsonProperty,以便将其Map到请求JSON。

相关问题