Java EE。服务中的客户端IP。使用EJBContext

时间:2018-10-05 02:54:12

标签: java-ee ejb

我有一个包含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

告诉我怎么了?任何想法我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:0)

您只能在EJB调用中使用EJB上下文,以便在EJB调用或生命周期方法中传递数据。

您可以在过滤器中尝试使用此方法:通常,同步调用由同一线程执行。您可以将IP地址存储在ThreadLocal的过滤器中,并在需要时进行访问。

在执行此操作时,请参阅此帖子:Stackoverflow: ThreadLocal usage in enterprise applications