我有一个托管bean(@Named
和@RequestScoped
(,应用程序的其余部分使用它来检索正在处理的当前请求的客户端的IP地址。这个bean在JSF和JAX-RS上下文中都使用。
对于JAX-RS,我使用将请求注入字段
@Context
HttpServletRequest httpRequest;
如果是null
,我会尝试得到这样的请求:
final FacesContext jsfCtxt = FacesContext.getCurrentInstance();
if ( jsfCtxt != null ) {
return (HttpServletRequest) jsfCtxt.getExternalContext().getRequest();
} else {
Logger.getLogger(DataverseRequestServiceBean.class.getName()).log(Level.WARNING, "Cannot get the HTTP request object.");
return null;
}
但是,JSF上下文中的一些bean在上下文存在之前调用此方法,而此jsfCtxt
是null
,因此不会获得任何请求。这就把事情搞砸了。
是否有一种从托管bean获取JavaEE中的HTTP请求的单向catch-em-all方法?
谢谢!
一致的Java EE方式是CDI。
@Inject
private HttpServletRequest request;
确保将JAX-RS资源注释为@RequestScoped
,以使其也能在那里工作。
另请参阅:
- 支持Bean(@ManagedBean(还是CDI Bean(@Named(
- Java EE 7教程-在JAX-RS中集成CDI