我正在使用Java EE。每次用户向服务器发出请求时,URL将包含用户的userId。例如,URL可能是
\ http://myApp.com/path-to-resource/?userId = 1
我正在编写的大量方法都需要访问userId参数。我可以修改我的代码,以便这些方法中的每个方法都有一个附加参数,并带有@QueryParam(userId)字符串userId注释,但这似乎有点多余和草率。
我想要的是一个名为UserIdProvider的类,该类将具有一个名为getUserId的方法。我的Resource类将有一个此类的实例,然后getUserId将访问当前请求并返回其userId参数。
这可能吗?我以为它可能与@RequestScoped注释有关,但我无法真正理解如何实现它。
答案 0 :(得分:1)
您可以使用过滤器提取此信息并将其公开,例如,作为CDI bean公开,以供注入。
或者,根据您的需要,只需在资源类的字段中使用@QueryParam
:
@QueryParam("userId")
private Long userId;
答案 1 :(得分:0)
我最终得到的解决方案是制作一个servlet过滤器,该过滤器提取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");
}
}
然后在我的资源中,我可以注入一个提供用户ID的提供程序。
private final Provider<String> userIdProvider;
@Inject
public ProfileResource(@Named("userId") Provider<String> userIdProvider) {
this.userIdProvider = userIdProvider;
}
这使我可以通过调用userIdProvider.get()
来访问当前的userId。
我认为此解决方案比通常所需的步骤复杂得多,因为我正在使用Guice进行依赖项注入,它与jersey / restful java的标准依赖项注入器进行了斗争,但是效果很好!