Java EE.Клиентский IP в обслуживании.Используйте EJBContext - PullRequest
0 голосов
/ 05 октября 2018

У меня есть проект с 2 модулями: Отдых и Сервис.Мне нужен клиентский IP в сервисном модуле, но я могу получить его только в модуле Rest из запроса.Я думаю об использовании EJBContext.getContextData () для предоставления этого IP в другом модуле.

В состоянии покоя я создаю:

@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 private EJBContext ejbContext;

в MyContainerRequestFilter - затем ejbContext = null;

Итак, в моем примере

applicationService.getEJBContext().getContextData() - NullPointerException

Скажите, что не так?Есть идеи, как мне это сделать?

Спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете использовать контекст EJB в вызовах EJB только для передачи данных в вызове EJB или методах жизненного цикла.

Вы можете попробовать это в своем фильтре: обычно синхронные вызовы выполняются одним и тем же потоком.Вы можете сохранить IP-адрес в фильтре в ThreadLocal и обращаться к нему при необходимости.

Пожалуйста, используйте этот пост, когда вы делаете это: Stackoverflow: использование ThreadLocal в корпоративных приложениях

...