Der Application Support ist eine Bibliothek mit integrativen Code für JSF2, JSF Ext, Spring Framework und JPA / Hibernate. Ziel ist, häufig verwendete Komponenten für den einfachen Aufbau einer Applikation erfolgreich zu kombinieren. Application Support liefert eine Reihe nützlicher Bausteine. Application Support kann über das Intersult Maven Repository bezogen werden:
<dependency> <groupId>com.intersult</groupId> <artifactId>application-support</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
Methode | Beschreibung |
---|---|
getContext | Liefert den (Spring-)ApplicationContext |
createEntityManager | Liefert den EntityManager zum Durchführen von Datenbank-Operationen außerhalb der Spring-Injection, wie zum Beispiel beim Bau von Validators und Converters. Der so erhaltene EntityManager muss in jedem Fall in einem try-finally-Block mit der Methode close geschlossen werden. Andernfalls entsteht ein Speicher- und Ressourcen-Leck. |
Daher eine ScopeInjectionFactory:
@Component public class ScopeInjectionFactory implements InjectionFactory<ScopeValue> { @Override public Class<ScopeValue> getAnnotationType() { return ScopeValue.class; } @Override public Object create(Class<?> type, String beanName, ScopeValue annotation) { Scopes scopes = Scopes.instance(); if (scopes == null) return null; Scope scope = scopes.getScope(); if (scope == null) return null; return scope.get(beanName); } }
Die dazugehörige Annotation:
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.METHOD}) public @interface ScopeValue { }
Die Spring-Injection der JSF Ext Scopes ist auch in der Jsf Spring Integration enthalten.
Ein einfaches Beispiel kann so aussehen:
@Component public class AutowireTest { @Autowired private InjectBean injectBean; @Factory public InjectBean injectBeanFactory() { return new InjectBean("from factory"); } @Test public void test() { System.out.println(injectBean.getText()); } } public class InjectBean { private String text; public InjectBean(String text) { this.text = text; } public String getText() { return text; } }
Erklärung: In diesem Fall ist InjectBean ein einfaches POJO. Die Factory und die Verwendung liegen sogar innerhalb der gleichen Component, natürlich kann die Factory auch durch jede andere Spring-Component implementiert werden.
Die Klasse EventRequestAttributes stellt diese zur Verfügung:
WebApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(event.getSession().getServletContext()); EventRequestAttributes request = new EventRequestAttributes(event); try { RequestContextHolder.setRequestAttributes(request); } finally { request.requestCompleted(); RequestContextHolder.resetRequestAttributes(); }
Die Klasse ContextSessionListener implementiert dies bereits für den HttpSessionListener, sodass sie bequem abgeleitet werden kann:
public class UserListener extends ContextSessionListener { @Override public void sessionCreated(HttpSessionEvent event, WebApplicationContext applicationContext) { Authenticator authenticator = applicationContext.getBean(Authenticator.class); authenticator.createSession(event.getSession()); } @Override public void sessionDestroyed(HttpSessionEvent event, WebApplicationContext applicationContext) { Authenticator authenticator = applicationContext.getBean(Authenticator.class); if (authenticator.getCurrentUser() != null) authenticator.logout(event.getSession()); } }