Sie können, aber ich würde ein einfaches POJO verwenden, nur um Dinge sauber getrennt zu halten. Beachten Sie, dass auf den im Singleton gespeicherten Wert nur derselbe Thread zugreifen kann, der die Servlet-Anfrage bearbeitet hat. Wenn Sie also Asynch ausführen, müssen Sie dies berücksichtigen. Hier ist ein super Grund impl:
public class OrgId {
public static ThreadLocal<Integer> orgId = new ThreadLocal<Integer>();
}
Da die Organisations-ID mit Wohnsitz in der Sitzung ist, können Sie den Wert des Thread in einem frühen Servlet-Filter einstellen könnte wie folgt (nicht viel Fehlerüberprüfung):
public class OrgIdFilter implements Filter {
public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws java.io.IOException, javax.servlet.ServletException {
int orgId = 0;
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpSession session = req.getSession();
orgId = Integer.parseInt(session.getAttribute("OrganizationalIdAttr"));
try {
OrgId.orgId.set(orgId);
filterChain.doFilter(servletRequest, servletresponse);
} finally {
OrgId.orgId.set(null); // Important to clear after request !!
}
}
}
Dies setzt voraus, dass der OrgID in der Sitzung ist, wenn die Filter genannt wird, aber wenn nicht, bekommen Sie die Idee ....
Dann in Ihrem Interceptor (oder so ziemlich überall) Sie den aktuelle OrgID Thread bekommen mit:
Ein potentielles Problem hier ist, dass alle diese Komponenten (Filter, OrgId und Interceptor) vom selben Klassenlader geladen werden müssen, um sicherzustellen, dass die OrgId Klasse effektiv ein Singleton ist, ansonsten mit mehreren Instanzen des ThreadLocal Um es herumzuhängen wird nicht konsequent oder überhaupt funktionieren. Unnötig zu sagen, dass all dies in derselben VM stattfinden muss.
Ich bin mir nicht sicher, ob dies der sauberste Weg ist, um dieses Problem zu lösen, aber es bringt Sie Ihre OrgId, wo Sie es brauchen.
Wollen Sie damit sagen, dass ich eine Thread Variable in meinem Servlet haben kann/Controller und es in den Hibernate Interceptor bekommen? Wie greife ich auf die Variable ThreadLocal zu? Sollte es im Servlet öffentlich sein? – Sathish
Bereitstellung der zweiten Antwort. – Nicholas
Btw EventSource, auf die von FlushEntityEvent zugegriffen werden kann, ist eine Sub-Schnittstelle von Session, so dass Sie nicht durch EntityPersister usw. laufen müssen –