Spring MVC(4.3.3) - RestController使用直接字段访问获取请求参数

时间:2018-04-17 10:51:47

标签: java spring spring-mvc

说我有RestController

@RestController
@RequestMapping("path")
public class MyRestController {
    @GetMapping("path")
    public void myMethod(final MyObject object) throws Exception {
        ...
    }
}

默认情况下,Spring使用getter和setter设置object变量的字段值 如何指定使用直接字段访问?

我尝试使用自定义Configuration类,但它不起作用。

@Configuration
public class CustomWebMvcConfigurationSupport extends WebMvcConfigurationSupport {
    @Override
    protected ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
        final ConfigurableWebBindingInitializer initializer = super.getConfigurableWebBindingInitializer();
        initializer.setDirectFieldAccess(true);
        return initializer;
    }
}

1 个答案:

答案 0 :(得分:1)

在处理项目时,您不太了解每个XML文件。当使用XML和Java配置的混合时,某些东西可能无法按预期工作(特别是如果您没有仔细阅读Spring文档)。

基本上,如果您已经定义了如下的XML配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans ... [skipped]>
    <description>Spring XML configuration</description>
    <mvc:annotation-driven />
    <context:component-scan base-package="com.my.package" />
</beans>

您尝试自定义扩展WebMvcConfigurationSupport的网络配置:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
    @Override
    protected ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
        final ConfigurableWebBindingInitializer initializer = super.getConfigurableWebBindingInitializer();
        initializer.setDirectFieldAccess(true);
        return initializer;
    }
}

您基本上处理两个不同的实例,一个是Spring使用XML描述创建的,另一个是WebMvcConfiguration创建的。

我只使用Java配置解决了。 因此,通过这种方式对web.xml文件进行编码,您可以完全删除XML配置。您可以看到我指定我想要contextClass参数的注释配置,以及contextConfigLocation参数的配置类

<servlet>
    <servlet-name>SpringDispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
         <param-name>contextClass</param-name>
         <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
     </init-param>
     <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>com.my.package.WebMvcConfiguration</param-value>
     </init-param>
</servlet>

请记住将@ComponentScan注释添加到Java类:

@ComponentScan("com.my.package")