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