java - 如何将HTTP GET请求参数绑定(bind)到JavaBean对象变量?

标签 java spring spring-mvc

在此期间,我正在研究 Sping MVC 展示示例,可下载表单 STS 仪表板。

请求数据部分展示了如何将 HTTP GET 请求的参数绑定(bind)到 JavaBean 的同名变量。

实际上我有以下链接:

 <a id="group" class="textLink" 
    href="<c:url value="/data/group?param1=foo&param2=bar&param3=baz" />">
       Group of query parameters
 </a>

此链接生成一个针对“/data/group”URL 的 GET HTTP 请求。该请求携带3个参数,分别为param1、param2、param3。

此请求由我的 Controller 类的以下方法处理:

@RequestMapping(value="group", method=RequestMethod.GET)
public @ResponseBody String withParamGroup(JavaBean bean) {
    return "Obtained parameter group " + bean;
}

withParamGroup() 方法获取一个 JavaBean 对象,该对象只是一个包含 3 个变量和 getter/setter 方法的对象,如下所示:

public class JavaBean {

    private String param1;
    private String param2;
    private String param3;

        // GETTER & SETTER method
}

因此HTTP请求中的param1参数存储在JavaBean对象的param1变量中,param2和param3也是如此。

好吧...我想这对我来说很清楚...但是...这个操作是谁做的?是Spring框架自动制作的吗?

为什么我不必像在 Controller 方法中将单个 HTTP 请求参数与单个变量绑定(bind)时那样使用 @RequestParam 注释之类的东西?

另一个疑问是:HTTP 参数名称必须与 JavaBean 变量相同,还是只是将第一个参数值存储在 JavaBean 对象的第一个变量中?

谢谢

安德里亚

最佳答案

有趣的是,Spring 文档似乎缺乏有关此功能的详细信息,但 Spring MVC 文档中的一些要点似乎表明 Spring 负责在请求映射过程中应用此行为。文档中有关使用 @RequestParam 属性将请求参数绑定(bind)到方法参数的部分引用了此功能(位于 here ):

Type conversion is applied automatically if the target method parameter type is not String. See Section 16.3.3.14, “Method Parameters And Type Conversion”.

如果您随后转到引用的部分,文档建议 Spring 自动转换原始对象类型 ( here ):

String-based values extracted from the request including request parameters, path variables, request headers, and cookie values may need to be converted to the target type of the method parameter or field (e.g., binding a request parameter to a field in an @ModelAttribute parameter) they're bound to. If the target type is not String, Spring automatically converts to the appropriate type. All simple types such as int, long, Date, etc. are supported. You can further customize the conversion process through a WebDataBinder (see Section 16.3.3.15, “Customizing WebDataBinder initialization”) or by registering Formatters with the FormattingConversionService (see Section 6.6, “Spring 3 Field Formatting”).

不幸的是,这似乎没有充分解释为什么要转换非原始对象类型,但也许文档不具备最新的功能。

关于属性名称是否必须与参数匹配的最后一点 - 这是推测,因为我找不到任何文档来支持它,但我会根据您在 Spring 中遇到的这个“功能”的行为来猜测将根据名称而不是请求中的参数顺序来将参数与属性进行匹配。

关于java - 如何将HTTP GET请求参数绑定(bind)到JavaBean对象变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13860102/

相关文章:

java - 如何在 Spring 中拦截 RequestRejectedException?

spring - Gradle 多模块项目 : Apply module dependency to all subprojects except for itself

Java Spring 错误 : Could not get JDBC Connection

java - 如何为与JPA具有一对多关系的对象创建 Controller ?

spring-boot-starter-web @Autowired 不工作

java - 如何使用Spring显示本 map 片(保存在C盘)?

java - 如何对具有某状态条件的函数进行单元测试?

具有多个 @RequestBody 的 Spring MVC Controller

java - 类中的类设置变量会更改所有变量

java - 用于在 Linux 上创建 Java 守护程序服务的工具