Cache benutzen um u.a. Suchergebnis zu cachen

Hi,

ich habe hier eine Webapplikation wo es gewünscht ist dass wir ein Suchergebnis cachen denn basierend darauf müssen wir dann, je nach User Interaktion, weitere Seiten anzeigen (Details, Druck, etc) und brauchen dabei wieder die gleichen Daten welche mir das Suchergebnis ja bereits geliefert hat.

Wir benutzen Spring, Backend ist keine Datenbank sondern ein Webservice wovon wir die Daten bekommen.

Ich habe mir hierzu schon die Spring Annotationen @Cacheable und @CacheEvict angesehen jedoch komme ich da nicht so wirklich auf einen grünen Zweig. Wenn ich nun bspw. @Cacheable über die Such-Service-Methode schreibe dann wird das Suchergebnis bereits erfolgreich gecached, sprich beim erneuten Anfragen mit den gleichen Daten gehen wir auf den Cache und rufen nicht mehr das Backend auf.

Mein Problem hierbei ist, wie bekomme ich die Daten wieder aus dem Cache? Sprich nach der Suche kommt der User auf die Suchergebnisseite (Daten sind im Cache), danach kann selbiger noch das Suchergebnis drucken oder von einem der Listeneinträge sich die Details anzeigen lassen.

Sprich ich muss, wenn der User den Bereich verlässt, d.h. mittels Menü in einen anderen Bereich der Applikation (wo das Suchergebnis obsolet ist da nicht mehr gebraucht) wechselt dass ich dann @CacheEvict aufrufen muss? Jedoch werden dann alle Daten, sprich alle Suchergebnisse (auch der anderen User) gelöscht? Kann man da dezidierter Löschen oder ganz anders machen? Oder ist das Ding pro Session? Kann man das ändern anpassen (bräuchte caches für die session aber auch welche für die application)?


@Override
	@CacheEvict(value = "test", beforeInvocation = true)
	@Cacheable(value = "test")
	public TestResultWrapper search(String s,
			TestRequest request) {
		TestResultWrapper w = service
				.search(s, request);

		return w;
	}

	@Override
	@Cacheable(value = "test")
	public TestResultWrapper load(String s,
			TestRequest request) {
		// was hier machen?
		return null;
	}

Beim Load soll ich da wirklich return null schreiben oder auch die Suche durchführen (obwohl er eigentlich vom cache den Wert nehmen sollte)?

Wie folgt wäre cool wenn das ginge (klappt natürlich nicht), nehme an ich muss pro scope einen eigenen Manager definieren?


	<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
		<property name="caches">
			<set>
				<bean
					class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
					p:name="default" />
				<bean
					class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
					p:name="testSearchResult" scope="session" />
				<bean
					class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"
					p:name="fixedValues" scope="singleton" />
			</set>
		</property>
	</bean>

*** Edit ***

Ok, leider kann ich meinen vorherigen Post nicht mehr editieren, deshalb vergesst meine obigen “uninformierten” Fragen und wir konzentrieren uns auf folgendes:

Würde nun den ehcache benutzen (mehr Konfigurationsmöglichkeit) und habe nun versucht folgende Dependency meinem Projekt hinzuzufügen:


	<dependency>
			<groupId>com.googlecode.ehcache-spring-annotations</groupId>
			<artifactId>ehcache-spring-annotations</artifactId>
			<version>1.2.0</version>
		</dependency>

Jedoch bekomme ich nun bei folgenden Klassen eine Exception:


public class RequestHeaderAuthenticationFilterX
		extends
		org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter {

	@Override
	protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
		try {
			return super.getPreAuthenticatedPrincipal(request);
		} catch (PreAuthenticatedCredentialsNotFoundException e) {
			return null;
		}
	}
}

Exception:


The hierarchy of the type RequestHeaderAuthenticationFilterX is inconsistent

Das gleiche für


public class ApplicationConversionServiceFactoryBean extends
		FormattingConversionServiceFactoryBean {

	@SuppressWarnings("deprecation")
	@Override
	protected void installFormatters(FormatterRegistry registry) {
		super.installFormatters(registry);
		// Register application converters and formatters
	}
}

Exception:


The hierarchy of the type ApplicationConversionServiceFactoryBean is inconsistent

Nehme an die Vaterklassen existieren nicht mehr? Alternativen?

Noch was anderes zum Cache Handling:
-)Das Webservice retouniert mir ein Objekt welches mehrere Listen beinhaltet, ist es möglich dass ich nun jede dieser Listen einzeln in den Cache schreiben kann (soll nur einmal bei Applikationsstart passieren) oder muss ich nun dieses Webservice für jede Liste einzeln aufrufen?

-)Kann man statt “removeAll” auch ganz genau einen Eintrag aus dem Cache entfernen?