2016-02-02 2 views
2

Использование Spring MVC @Controller, как я могу использовать конечную точку @RequestMapping, которая имеет атрибут @ModelAttribute, объявленный как интерфейс?Spring MVC ModelAttribute as Interface

Я хочу, чтобы на отображение отображалось три разных формы, которые лежат в основе всех классов интерфейса.

Так, например, я могу иметь три различных объекта формы с действием на следующее:

@RequestMapping(path="/doSomething", method=RequestMethod.POST) 
public String doSomething(ObjectInterface formInfo) { 
    ... 
} 

(. Где ObjectInterface представляет собой интерфейс, а не конкретный класс)

+0

я могу писать код сам направить Весну на правильный конкретный класс боба, чтобы связать запрос, что он может создать экземпляр для запроса, если я могу проверить входящие данные, поскольку этот класс реализует интерфейс. Тогда Spring просто должен передать это в метод. Мне интересно, можно ли каким-то образом реализовать это. Это легко сделать возможным, если Spring допускает такую ​​настройку. – FiguringThisOut

+0

Я думаю, что это хорошая идея с точки зрения общего дизайна, но не для атрибутов Spring и Model. Spring сопоставляет входные значения формы с полями объекта. Кроме того, я считаю, что лучшая практика заключается в том, чтобы иметь один контроллер для каждого «раздела» приложения. Кажется, что вы связываете взгляды из разных доменов с общим контроллером; может быть, я не понимаю. – ChiefTwoPencils

+0

Я думаю, что писать и регистрировать пользовательский HandlerMethodArgumentResolver может сделать трюк. Я буду обновлять, как только у меня будет что-то работающее, если это решение. – FiguringThisOut

ответ

0

Фигурные его. Он предназначен для записи и регистрации пользовательского HandlerMethodArgumentResolver. Ниже приведен код ядра. Вам просто нужно выяснить, какой конкретный класс bean-класса перейдет в webDataBinderFactory. Затем ваш контроллер может быть записан для принятия интерфейса, и вам будет предоставлен конкретный исполняющий компонент позади интерфейса.

public class MessageResolverTest implements HandlerMethodArgumentResolver { 

    public boolean supportsParameter(MethodParameter methodParameter) { 
     return methodParameter.getParameterType().equals(<Interface>.class); 
    } 

    public Object resolveArgument(MethodParameter methodParameter, 
            ModelAndViewContainer modelAndViewContainer, 
            NativeWebRequest nativeWebRequest, 
            WebDataBinderFactory webDataBinderFactory) throws Exception { 

     String name = ModelFactory.getNameForParameter(methodParameter); 
     WebDataBinder webDataBinder = webDataBinderFactory.createBinder(nativeWebRequest, new <ConcreteBean>(), name); 
     MutablePropertyValues mutablePropertyValues = new MutablePropertyValues(nativeWebRequest.getParameterMap()); 
     webDataBinder.bind(mutablePropertyValues); 

     return webDataBinder.getBindingResult().getTarget(); 
    } 
} 
Смежные вопросы