From 1bb6d29be23cb543a1a023ace669f1f7485d2d90 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 28 Nov 2011 22:34:29 +0000 Subject: [PATCH] AbstractCachingViewResolver caches unresolved view names by default ("cacheUnresolved"=true; SPR-8173) --- .../view/AbstractCachingViewResolver.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java index 99d54547c5f..7bf24fba2d4 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,8 +42,8 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu /** Whether we should cache views, once resolved */ private boolean cache = true; - /** Whether we should attempt to resolve views again if unresolved once */ - private boolean cacheUnresolved = false; + /** Whether we should refrain from resolving views again if unresolved once */ + private boolean cacheUnresolved = true; /** Map from view key to View instance */ private final Map viewCache = new HashMap(); @@ -65,15 +65,17 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu public boolean isCache() { return this.cache; } - + /** - * Whether a view name once resolved to {@code null} should be cached and + * Whether a view name once resolved to {@code null} should be cached and * automatically resolved to {@code null} subsequently. - *

Default is "false": unresolved view names are not cached. - *

Of specific interest is the ability for some AbstractUrlBasedView - * implementations (Freemarker, Velocity, Tiles) to check if an underlying + *

Default is "true": unresolved view names are being cached, as of Spring 3.1. + * Note that this flag only applies if the general {@link #setCache "cache"} + * flag is kept at its default of "true" as well. + *

Of specific interest is the ability for some AbstractUrlBasedView + * implementations (FreeMarker, Velocity, Tiles) to check if an underlying * resource exists via {@link AbstractUrlBasedView#checkResource(Locale)}. - * With this flag set to "false", an underlying resource that re-appears + * With this flag set to "false", an underlying resource that re-appears * is noticed and used. With the flag set to "true", one check is made only. */ public void setCacheUnresolved(boolean cacheUnresolved) { @@ -84,9 +86,10 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu * Return if caching of unresolved views is enabled. */ public boolean isCacheUnresolved() { - return cacheUnresolved; + return this.cacheUnresolved; } + public View resolveViewName(String viewName, Locale locale) throws Exception { if (!isCache()) { return createView(viewName, locale); @@ -95,13 +98,14 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu Object cacheKey = getCacheKey(viewName, locale); synchronized (this.viewCache) { View view = this.viewCache.get(cacheKey); - boolean isCached = this.cacheUnresolved && this.viewCache.containsKey(cacheKey); - if (view == null && !isCached) { + if (view == null && (!this.cacheUnresolved || !this.viewCache.containsKey(cacheKey))) { // Ask the subclass to create the View object. view = createView(viewName, locale); - this.viewCache.put(cacheKey, view); - if (logger.isTraceEnabled()) { - logger.trace("Cached view [" + cacheKey + "]"); + if (view != null || this.cacheUnresolved) { + this.viewCache.put(cacheKey, view); + if (logger.isTraceEnabled()) { + logger.trace("Cached view [" + cacheKey + "]"); + } } } return view;