Весна MVC. Значения по умолчанию для полей параметра метода
У меня есть простой контроллер с методом test:
@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 ответ
Вы можете опираться на разрешение споров в четыре простых шага, аналогично тому, как вы предлагали в своем третьем пункте.
- Создайте аннотацию, например
@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) {
дата создания экземпляра просто для того, чтобы понять суть реализации, очевидно, вы будете использовать любую идею