3

Spring MVCを使用しorg.springframework.ui.Modelて、コントローラー内のメソッドパラメーターで指定する必要がないように、を因数分解する方法はありますか?

言い換えれば、私は現在このようにそれをやっています:

public abstract class AbstractController {

    @Autowired
    protected MultipartHttpServletRequest request;

}

@Controller
public class SigninController extends AbstractController {

    @RequestMapping(value = "/signin", method = RequestMethod.GET)
    public String signin(@ModelAttribute User user, Model model) {
        // do stuff with user (parameter)
        // do stuff with model (parameter) <--
        // do stuff with request (attribute)
        return "/signin/index";
    }

}

そして、私はそのようにしたいと思います:

public abstract class AbstractController {

    @Autowired
    protected MultipartHttpServletRequest request;

    @Autowired
    protected Model model;

}

@Controller
public class SigninController extends AbstractController {

    @RequestMapping(value = "/signin", method = RequestMethod.GET)
    public String signin(@ModelAttribute User user) {
        // do stuff with user (parameter)
        // do stuff with model (attribute) <--
        // do stuff with request (attribute)
        return "/signin/index";
    }

}

ただし、URLを呼び出すと、例外がスローされます。

...Could not autowire field: protected org.springframework.ui.Model...
...No matching bean of type [org.springframework.ui.Model] found for dependency...

を使用したときに同じエラーが発生しましたorg.springframework.ui.ModelMap

天才的な解決策はありますか?

助けてくれてありがとう:)

4

1 に答える 1

1

私は最終的に解決策を見つけました。ゲームにそれだけの価値があるかどうかはわかりませんが、うまくいきます:)

まず、これらのものをに追加しますAbstractController

public abstract class AbstractController {

    @Autowired
    protected MultipartHttpServletRequest request;

    protected ModelMap model;

    public void setModel(ModelMap model) {
        this.model = model;
    }

    public ModelMap getModel() {
        return model;
    }

}

org.springframework.web.servlet.HandlerInterceptor次に、次のように実装するインターセプターを作成します。

public class UserContextInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
        if (handler instanceof AbstractController) {
            AbstractController controller = (AbstractController) handler;
            controller.setModel(new ModelMap());
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        if (handler instanceof AbstractController && modelAndView != null) {
            AbstractController controller = (AbstractController) handler;
            modelAndView.addAllObjects(controller.getModel());
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

}

最後に、次の行を に追加しますapplicationContext.xml

<mvc:interceptors>
    <bean class="path.to.my.just.created.UserContextInterceptor" />
</mvc:interceptors>

そしてもちろん、コントローラーにAbstractController.

ここにあります!requestあなたのコントローラーメソッドパラメーター内であなたもあなたも指定する必要はmodelもうありません:)私はそのトリックの有用性について本当に確信していませんが、ええ。それがマニアックな開発者をより幸せにすることができれば:)

ただし、より簡単なソリューションにはまだオープンです。

于 2012-04-25T21:55:46.340 に答える