Вопрос

Это пример кода из пружины 3.1 Блог Spring Source: от XML до @Configuration Я пытаюсь реализовать в своем приложении (что было сделано весной 2.0, а не со мной, так что это много обучения).

@FeatureConfiguration
class MvcFeatures {

    @Feature
    public MvcAnnotationDriven annotationDriven(ConversionService conversionService) {
        return new MvcAnnotationDriven().conversionService(conversionService)
            .argumentResolvers(new CustomArgumentResolver());
    }

    // ...

}

Однако я не могу понять смысл .argumentReSolvers (новый CustomArgumentReSolver ()) И их CustomargumentResolver выглядит как реше. Какой смысл в этом?

public class CustomArgumentResolver implements WebArgumentResolver {

    @Override
    public Object resolveArgument(MethodParameter param, NativeWebRequest request) throws Exception {
        RequestAttribute attr = param.getParameterAnnotation(RequestAttribute.class);
        if (attr != null) {
            return request.getAttribute(attr.value(), WebRequest.SCOPE_REQUEST);
        } else {
            return WebArgumentResolver.UNRESOLVED;
        }
    }
}
Это было полезно?

Решение

Чтобы добавить в ответ @Garyf и прояснить некоторые моменты, Spring 2.5 представила аннотированные контроллеры, которые заменили старые контроллеры в стиле интерфейса Spring 2.0. Эти новые контроллеры имеют методы без фиксированных параметров - метод объявляет параметры, которые ему необходимы для выполнения своей работы, и ничего более.

Например, скажем, методу контроллера нужен одна вещь, чтобы выполнить свою задачу - параметр запроса, который содержит идентификатор объекта из базы данных. Весной 2.0 вам нужно будет реализовать что -то вроде AbstractController.handleRequestInternal(), например

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
   String id = request.getParameter("id");
   MyThing obj = getObjById(id);
   //... do stuff and return ModelAndView
}

Весна 2.5 сделала это проще:

@RequestMapping
public ModelAndView handle(String id) {
   MyThing obj = getObjById(id);
   //... do stuff and return ModelAndView
}

Здесь мы объявляем только параметры для того, что нам нужно.

Пока все хорошо, но именно здесь обычай WebArgumentResolver входит. Скажем, я хочу удалить getObjById Из моего контроллера вообще, потому что, может быть, я думаю, что он захватывает код, и, возможно, он используется во многих других методах контроллера. Вместо этого я хочу сделать это:

@RequestMapping
public ModelAndView handle(MyThing id) {
   //... do stuff and return ModelAndView
}

Это еще проще, и имеет минимум кода шаблона. Обычай WebArgumentResolver может быть зарегистрирован в контексте приложения, который распознает параметры типа MyThing, и знает, как извлечь информацию из запроса. Spring вызывает, что решает, и передает результат методу контроллера.

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

Пример в вашем вопросе использует CustomArgumentResolver Чтобы разрешить пользовательский пример RequestAttribute учебный класс. Резольвер вытаскивает атрибуты запроса и связывает их с RequestAttribute Объекты, чтобы их можно было объявить как параметры метода контроллера.

Другие советы

WebArgumentResolverS-это способ указать, как должны быть разрешены параметры методов отображения MVC. Если вы хотите использовать пользовательский объект в качестве параметра для метода отображения MVC, Spring пытается выяснить, как понять его по-своему. Как правило, это происходит через привязку, где некоторые параметры HTTP, которые вы отправляете, совпадают с полями объекта, а пружина соответствуют им и создают для вас новый объект.

Если у вас когда -либо есть ситуация, когда представленные параметры не совпадают с параметрами вашего метода, WebargumentReSolvers существуют для заполнения пробела: вы предоставляете пользовательскую логику, чтобы пружина не должна выяснять.

В вашем примере PARAM - это один из таких параметров, который будет сопоставлен. Этот кусок пользовательского кода сначала проверяет, имеет ли параметр аннотацию @requestatttribute. Если это так, то пользовательский код извлекает значение из этого объекта и рассматривает его как атрибут по запросу HTTP, возвращая его. Он не имеет этой аннотации, тогда метод возвращает неразрешенное значение, что просто указывает на то, что этот WebargumentResolver ничего не знает об этом конкретном параметре, и пружина должна попробовать другой метод (например, привязку).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top