我有一个包含2个模块的项目:休息和服务。 我需要服务模块中的客户端IP,但是我只能从Request中的Rest模块中获得它。 我考虑使用EJBContext.getContextData()在其他模块中提供此IP。
我在Rest中创建:
@Provider
@ApplicationScoped
public class MyContainerRequestFilter implements ContainerRequestFilter {
@Context
private HttpServletRequest servletRequest;
@Inject
private ApplicationService applicationService;
@Override
public void filter(ContainerRequestContext requestContext) {
try {
applicationService.getEJBContext().getContextData().put("ipAddress", servletRequest.getRemoteAddr());
applicationService.getEJBContext().getContextData().put("ipHost", servletRequest.getRemoteHost());
} catch(Exception ingnore) {
}
}
}
@LocalBean
@Stateless
public class ApplicationService {
@Resource
private EJBContext ejbContext;
public EJBContext getEJBContext() {
return ejbContext;
}
}
如果我使用
@Resource私有EJBContext ejbContext;
在MyContainerRequestFilter中-然后ejbContext = null;
所以,在我的示例中
applicationService.getEJBContext().getContextData() - NullPointerException
告诉我怎么了?任何想法我该怎么做?
谢谢!
答案 0 :(得分:0)
您只能在EJB调用中使用EJB上下文,以便在EJB调用或生命周期方法中传递数据。
您可以在过滤器中尝试使用此方法:通常,同步调用由同一线程执行。您可以将IP地址存储在ThreadLocal的过滤器中,并在需要时进行访问。
在执行此操作时,请参阅此帖子:Stackoverflow: ThreadLocal usage in enterprise applications