Spring如何获取没有调试信息的参数名称

时间:2016-04-07 04:47:43

标签: spring spring-mvc reflection

@RequestMapping("/form")
public String form(Model model, Integer id)

例如,spring可以知道参数id的名称是id,并在运行时将请求param的值绑定到它

2 个答案:

答案 0 :(得分:2)

这是JDK 8中引入的javac的一个功能。您需要包含-parameters javac命令行选项来激活它。然后你就可以获得这样的参数名称:

String name = String.class.getMethod("substring", int.class).getParameters()[0].getName()
System.out.println(name);

来自Spring文档3.3 Java 8 (as well as 6 and 7)

  

您还可以使用Java 8的参数名称发现(基于   -parameters compiler flag)作为在启用调试信息的情况下编译代码的替代方法。

ParameterNameDiscoverer类的javadoc中指定:

  

参数名称发现并不总是可行,但各种各样   可以尝试使用策略,例如查找调试信息   可能是在编译时发出的,并且正在寻找argname   注释值可选地伴随AspectJ注释方法。

这是Spring项目Java 8 parameter name discovery for methods and constructors

中相关JIRA项目的链接

JDK增强提案JEP 118: Access to Parameter Names at Runtime

答案 1 :(得分:1)

WebDataBinder是谁为你做的。

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/WebDataBinder.html

正如您在api上看到的,WebDataBinder用于从Web请求参数到JavaBean对象的数据绑定。

WebDataBinder还负责验证和转换,这就是为什么如果你有自定义编辑器或验证器,你必须将它们添加到控制器中的webDataBinder,如下所示。

        @Controller
        public class HelloController {

            @InitBinder
            protected void initBinder(WebDataBinder binder) {
                binder.setValidator(yourValidator);
                binder.registerCustomEditor(the clazz to conver to.class, "the name of the parameter", yourEditor);
            }
    ...

有关详细信息,您必须查看文档

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html