当前位置: 首页 > 知识库问答 >
问题:

@RequestParam Spring 4.0->4.2

徐洛华
2023-03-14

我注意到Spring在Spring 4.2中改变了RequestParam将参数封送到控制器endpoint的方式。也就是说,当我有这样的东西:

public String myEndpoint(@RequestParam List<String> strings) {
   ...
}

以前发送的超文本标记语言输入元素的value属性为空,将作为空包含在列表中。在4.2中,它们是空字符串。'

例如:

/myEndpoint?strings=

结果为空列表。

/myEndpoint?string=a&string=

结果是[“a”,而过去是[“a”,null]

我在发布说明中看到@RecestParam的行为确实从4.0更改为4.2。有没有简单的方法来创建一个新类或扩展RecestParam以使其像以前一样工作,这样我就不必更改任何控制器逻辑?

例如,而不是Spring 4.2请求Param:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {

    @AliasFor("name")
    String value() default "";

    @AliasFor("value")
    String name() default "";

    boolean required() default true;

    String defaultValue() default ValueConstants.DEFAULT_NONE;

}

制作我自己的注释来模仿Spring 4.0:

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyRequestParam {

    String value() default "";

    boolean required() default true;

    String defaultValue() default ValueConstants.DEFAULT_NONE;

}

这是最简单的方法吗?

编辑:

所以上面的方法似乎不起作用。它失败了,出现了“无法实例化列表”错误,所以我想Spring是专门寻找请求参数来完成它的工作的。


共有1个答案

宰父宾实
2023-03-14

虽然@RequestParam的行为发生了变化,但我不认为这是问题的原因。

  • @RequestParam注释的所有属性只与它所注释的参数列表有关

如果查看解析@RequestParam参数的requestparamethodargumentresolver,请求参数将添加列表中

String[] paramValues = request.getParameterValues(name);
if (paramValues != null) {
    arg = (paramValues.length == 1 ? paramValues[0] : paramValues);
}

...

return arg;

可能的解决方案参数似乎从字符串[]转换为列表

>

MyCollectionEditor extends CustomCollectionEditor {

    @Override
    protected Object convertElement(Object element) {
        if(element instanceof String) {
            element = (String) element;
            // "" will be null
            element = (element.isEmpty()) ? null : element;
        }

        return element;
}

将编辑器添加到控制器中@InitBinder方法的活页夹中。

@InitBinder
public void myBinder(DataBinder binder) {
    //...

    binder.registerCustomEditor(...);

    //...
}

让我知道这是否适合你!

 类似资料:
  • 问题内容: Jboss 4.2.3支持什么Servlet Spec和JSP版本? 问题答案: 这取决于它使用的Tomcat版本。根据规范/发行说明,它使用的是Tomcat6.0.x。因此,它支持Servlet 2.5 / JSP 2.1。

  • 问题内容: 通过JDBC 4.1或更早版本从数据库中检索java.sql.Timestamp时,如何获取/转换为java.time对象? Postgres的开源JDBC驱动程序都不兼容JDBC 4.2,因此我正在寻找一种在JDBC 4.1中使用java.time的方法。 问题答案: 通过将驱动程序与Java 8及更高版本一起使用,您应该自动免费在对象上获取一些方法。两者和具有相似的转换方法。 即,

  • 问题内容: 我正在使用从此处下载的Eclipse Juno 4.2 。 在以前的安装中,我一直在使用3.7,并且一直在使用WindowBuilder,这对我非常有用。我注意到这次没有包含它,因此我使用了此页上提供的此更新站点(zip文件下载显示“文件不可用”错误)。 但是,当我运行安装程序时,安装程​​序迅速上升到28%,然后冻结。半小时后,我收到一个很长的错误,错误消息以以下文本开头: 收集要安

  • 问题内容: 我正在浏览此网站http://givemepass.blogspot.hk/2011/12/http- server.html 尝试使用android应用程序连接PHP服务器来获取消息。 GetServerMessage.java GetPhpServerMessageDemoActivity.java 我试图从该站点下载Android应用程序项目http://uploadingit.

  • 问题内容: 我编写了一个基于bluetoothChat的简单应用程序。我使用SPP配置文件在电话和蓝牙模块之间进行通信。电话始终会启动通信。该应用程序在使用Nexus 3和Samsung Galaxy 3的Android 4.2上完美运行。在更新至Android 4.3之后,该应用程序不再起作用。我一直保持连接状态,可以发送输出流并接收正确的数据,但是在执行第一个outputstream命令后,应

  • 问题内容: 我们的商业应用程序过去曾在不同的应用程序服务器上运行,因此我们开始对其进行调整,使其可以在JBoss服务器上运行。问题在于该应用程序运行JBoss缓存,并且作为与此框架集成的一部分,web- inf \ lib包含以下jar: jboss-aop.jar,jbosscache-core.jar,jboss-common.jar,jboss- common- core.jar,jboss

  • 问题内容: 因此,既然Eclipse juno是基于4.2而不是3.7的,那么升级到它的最简单方法是什么,除了安装单独的juno副本并将所有我现有的插件从3.7重新安装到它之外? eclipse.org上似乎没有提到简单的升级途径。 问题答案: Eclipse几乎无法从3.7.1升级到3.7.2,没关系从3.7升级到4.2。 如果您尝试对现有的Eclipse开发环境进行大量升级,那么您将掌握开发环

  • 问题内容: 数据库表中有一个类型列。但它没有按我预期的那样工作。 问题是 我需要在列中放入零,但每次尝试添加带有的记录时,它的价值都会增加。 我在这里发现了一个问题。。但是答案并没有说明问题的原因。很高兴有人可以解释这个问题。 问题答案: 具有类型字段意味着您每次插入/更新该字段时都需要使用原始值作为解决方法。 这是因为默认情况下,PDO将绑定这些值,并将它们视为字符串,因此将导致: 我建议将其更