Spring MVC。方法参数字段的默认值

时间:2015-04-06 10:57:06

标签: java spring spring-mvc

我有一个带方法测试的简单控制器:

 @RequestMapping(produces = "application/json")
    @ResponseBody
    public HttpEntity<Void> test(Test test) {
        return new ResponseEntity<>(HttpStatus.OK);
    }

测试类看起来像这样:

    public class Test {
    private String name;
    private Date date;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getDate() {
        return date;
    }

    @DateTimeFormat(iso= DateTimeFormat.ISO.DATE)
    public void setDate(Date date) {
        this.date = date;
    }
}

我需要Test对象字段的默认值。如果我有一个原始的参数,我就可以使用@RequestParam(required = false, defaultValue = "someValue")。但是对于非原始的参数,这种方法似乎并不起作用。我看到了几个变种如何处理它:

  • 在构造函数中指定值。不太好,因为可能是我会的 不同的方法需要不同的默认值。
  • 编写自定义DataBinder。更好,但问题不同 默认值仍然存在。
  • 使用默认值编写自定义DataBinder和自定义注释。

我错过了什么,有一个内置功能可以解决我的问题?

1 个答案:

答案 0 :(得分:1)

你可以通过四个简单的步骤依靠论证解决,就像你在第三点中所建议的那样。

  1. 创建注释,例如

  2. @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface TestDefaultValues {
        String[] value();
    }
    
    1. 写一个解析器,例如

    2. public class TestArgumentResolver implements HandlerMethodArgumentResolver {
      
          public boolean supportsParameter(MethodParameter parameter) {
              return parameter.getParameterAnnotation(TestDefaultValues.class) != null;
          }
      
          public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
                  WebDataBinderFactory binderFactory) throws Exception {
              TestDefaultValues attr = parameter.getParameterAnnotation(TestDefaultValues.class);
              String[] value = attr.value();
              Test test = new Test();
              test.setName(value[0]);
              test.setDate(new Date(value[1]));
              return test;
          }
      
      }
      
      1. 注册一个解析器

      2. <mvc:annotation-driven>
                <mvc:argument-resolvers>
                    <bean class="your.package.TestArgumentResolver"></bean>
                </mvc:argument-resolvers>
        </mvc:annotation-driven>
        
        1. 在控制器方法中使用注释,例如

        2.  public HttpEntity<Void> test(@TestDefaultValues({"foo","11/12/2014"}) Test test) {
          

          实例化日期只是为了获得实现的要点,显然你会使用你的想法