Весна 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 ответ

Вы можете опираться на разрешение споров в четыре простых шага, аналогично тому, как вы предлагали в своем третьем пункте.

  1. Создайте аннотацию, например

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TestDefaultValues {
    String[] value();
}
  1. Напишите резольвер, например

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. зарегистрировать распознаватель

<mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean class="your.package.TestArgumentResolver"></bean>
        </mvc:argument-resolvers>
</mvc:annotation-driven>
  1. используйте аннотацию в вашем методе контроллера, например

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

дата создания экземпляра просто для того, чтобы понять суть реализации, очевидно, вы будете использовать любую идею

Другие вопросы по тегам