Spring MVC为不同的URI处理相同的请求参数

时间:2013-07-27 17:51:19

标签: spring-mvc

我花了几天时间研究这个,但没有找到适合我情况的答案。我有一个Spring 3.1 MVC应用程序。目前,一些供应商通过Web客户端登录应用程序,在这种情况下,用户信息存储在会话中。我想通过RESTFul Web服务向其他供应商公开一些服务,但让供应商将其供应商ID作为URI的一部分或通过PARAMS传递。有没有办法在一个地方处理供应商ID,然后转发到相应的控制器进行请求处理?供应商ID应该是URI的一部分还是应该在请求主体中传递供应商ID?我已经研究过拦截器,但是如何使用多个URI或RESTFul Web服务的每个控制器?任何建议都将不胜感激

1 个答案:

答案 0 :(得分:1)

拥有自定义标头是最干净的选项,但参数也同样有效。 在拦截器 preHandle 方法中,您可以通过标头或参数查找供应商,并通过将对象添加到其属性来将其附加到请求。

request.addAttribute("vendor", myVendorInstance);

从那时起vendor可以从请求中检索到:

Vendor vendor = (Vendor) request.getAttribute("vendor");

可以使用映射(例如

)将拦截器映射到您喜欢的任何URL
<mvc:interceptor>
    <mvc:mapping path="/vendors/**" />
    <bean class="my.package.VendorLookupInterceptor" />
</mvc:interceptor>

使控制器可以使用供应商对象的另一种方法是注入它。例如,假设对该对象感兴趣的控制器应实现此接口。

public interface VendorAware {
    public void setVendor(Vendor vendor);
}

实现此接口的控制器可以由拦截器处理并让供应商注入。

if (handler instanceof HandlerMethod) {
    Object bean = ((HandlerMethod) handler).getBean();

    if (bean instanceof VendorAware) {
        Vendor vendor = getVendor();
        ((VendorAware) bean).setVendor(vendor);
    }
}