我有一个带方法测试的简单控制器:
@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")
。但是对于非原始的参数,这种方法似乎并不起作用。我看到了几个变种如何处理它:
我错过了什么,有一个内置功能可以解决我的问题?
答案 0 :(得分:1)
你可以通过四个简单的步骤依靠论证解决,就像你在第三点中所建议的那样。
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestDefaultValues {
String[] value();
}
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;
}
}
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="your.package.TestArgumentResolver"></bean>
</mvc:argument-resolvers>
</mvc:annotation-driven>
public HttpEntity<Void> test(@TestDefaultValues({"foo","11/12/2014"}) Test test) {
实例化日期只是为了获得实现的要点,显然你会使用你的想法