我需要在每次更新后在几个表中保存用户ID或会话ID,以了解哪个用户进行了更改。直接/天真的方法是在所有资源中的每个dao调用中传递用户ID或会话ID,并更改每个dao以将其作为参数,然后保存在db中。 有没有更好的/模块化/有效的方法来做到这一点?
答案 0 :(得分:2)
如果你在项目中使用Guice(和dropwizard-guice库),一个选项是创建请求范围的bean并在你的dao中注入它的提供者。所以你可以在guice module
:
@Provides
@RequestScoped
public SessionInfo domainContext(HttpHeaders headers) {
return new SessionInfo(headers.getHeaderString("sessionId"));
}
}
然后,将Provider<SessionInfo>
注入你的道。
另一种选择是实现请求过滤器并使用ThreadLocal
设置会话ID标头。它可能是这样的:
public class SessionContext {
private static final ThreadLocal<String> session = new ThreadLocal<>();
public static String getSession() {
return session.get();
}
public static void setSession(String sessionValue) {
session.set(sessionValue);
}
}
和简单的过滤器:
@Provider
public class SessionFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
SessionContext.setSession(requestContext.getHeaderString("test"));
}
}
然后你可以在你的dao中使用SessionContext
对象。