Решение, которое я выбрал, заключается в создании фильтра сервлетов, который извлекает userId и делает его именованным свойством Guice.
public class ServletStuff extends ServletModule {
protected Filter createUserIdScopingFilter() {
return new Filter() {
@Override public void doFilter(
ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String userId = httpRequest.getParameter("userId");
httpRequest.setAttribute(
Key.get(String.class, Names.named("userId")).toString(),
userId);
chain.doFilter(request, response);
}
@Override public void init(FilterConfig filterConfig) throws ServletException { }
@Override public void destroy() { }
};
}
@Override protected void configureServlets() {
filter("*").through(createUserIdScopingFilter());
}
@Provides
@Named("userId") @RequestScoped
String provideUserId() {
throw new IllegalStateException("user id must be manually seeded");
}
}
Затем в моих ресурсах я могу внедрить провайдера, которыйдает мне userId.
private final Provider<String> userIdProvider;
@Inject
public ProfileResource(@Named("userId") Provider<String> userIdProvider) {
this.userIdProvider = userIdProvider;
}
, который позволяет мне получить доступ к текущему userId, просто позвонив userIdProvider.get()
.
Я думаю, что это решение на один шаг более запутанное, чем обычно необходимо, так какЯ использую Guice для внедрения зависимостей, который борется со стандартным инжектором зависимостей для jersey / restful java, но он работает хорошо!