在dropwizard中(使用带有dao和资源对象的jdbi),如何在每次更新时优雅地保存数据库表中的用户ID /会话?

时间:2016-05-27 06:54:43

标签: dao dropwizard jdbi

我需要在每次更新后在几个表中保存用户ID或会话ID,以了解哪个用户进行了更改。直接/天真的方法是在所有资源中的每个dao调用中传递用户ID或会话ID,并更改每个dao以将其作为参数,然后保存在db中。 有没有更好的/模块化/有效的方法来做到这一点?

1 个答案:

答案 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对象。

相关问题