Skip to content

Commit 2e7f6a5

Browse files
Exception Handler auto-detection
1 parent fa4e8b5 commit 2e7f6a5

File tree

5 files changed

+47
-15
lines changed

5 files changed

+47
-15
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ By default, Stripes Dynamic Filter map to `/*`, whereas Stripes Filter maps to `
3636
* [2.0.0](https://github.com/juanpablo-santos/stripes-spring-boot/releases/tag/2.0.0)
3737
* [Support for Spring Boot 2](https://github.com/juanpablo-santos/stripes-spring-boot/issues/4)
3838
* New Stripes Actuator Endpoint detailing Stripes' filters configuration
39+
* Exception Handler autodetection
3940
* Can run side by side with Spring MVC, no need to set any property on your `application.properties` file
40-
* Faster startup time if `stripes.action-resolver-packages` is set on your `application.properties` file
41+
* Faster startup time if `stripes.action-resolver-packages` and/or `stripes.exception-handler` are set on your `application.properties` file
4142

4243
* [1.1.0](https://github.com/juanpablo-santos/stripes-spring-boot/releases/tag/1.1.0)
4344
* Update to latest 1.5 Spring Boot release

stripes-spring-boot-autoconfigure/src/main/java/net/sourceforge/stripes/springboot/autoconfigure/StripesAutoConfiguration.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import net.sourceforge.stripes.action.ActionBean;
2626
import net.sourceforge.stripes.controller.DynamicMappingFilter;
2727
import net.sourceforge.stripes.controller.StripesFilter;
28+
import net.sourceforge.stripes.exception.ExceptionHandler;
2829
import net.sourceforge.stripes.util.Log;
2930

3031

@@ -58,9 +59,7 @@ public StripesEndpoint stripesEndpoint( final FilterRegistrationBean< StripesFil
5859
@Bean( name = "stripesFilter" )
5960
@ConditionalOnMissingBean( name = "stripesFilter" )
6061
public FilterRegistrationBean< StripesFilter > stripesFilter( @Qualifier( "urlPatternsForStripesFilter" ) final List< String > urlPatternsForStripesFilter ) {
61-
final StripesFilter filter = new StripesFilter();
62-
63-
final Map< String, String > params = new HashMap< String, String >();
62+
final Map< String, String > params = new HashMap<>();
6463
setActionResolverPackages( params, "ActionResolver.Packages", properties.getActionResolverPackages() );
6564
putIfNotEmpty( params, "ActionBeanPropertyBinder.Class", properties.getActionBeanPropertyBinder() );
6665
putIfNotEmpty( params, "ActionBeanContext.Class", properties.getActionBeanContext() );
@@ -93,7 +92,7 @@ public FilterRegistrationBean< StripesFilter > stripesFilter( @Qualifier( "urlPa
9392
}
9493

9594
final FilterRegistrationBean< StripesFilter > registration = new FilterRegistrationBean<>();
96-
registration.setFilter( filter );
95+
registration.setFilter( new StripesFilter() );
9796
registration.setInitParameters( params );
9897
registration.setUrlPatterns( urlPatternsForStripesFilter );
9998
registration.setDispatcherTypes( DispatcherType.REQUEST );
@@ -104,10 +103,8 @@ public FilterRegistrationBean< StripesFilter > stripesFilter( @Qualifier( "urlPa
104103
@Bean( name = "stripesDynamicFilter" )
105104
@ConditionalOnMissingBean( name = "stripesDynamicFilter" )
106105
public FilterRegistrationBean< DynamicMappingFilter > stripesDynamicFilter( @Qualifier( "urlPatternsForStripesDynamicFilter" ) final List< String > urlPatternsForStripesDynamicFilter ) {
107-
final DynamicMappingFilter filter = new DynamicMappingFilter();
108-
109106
final FilterRegistrationBean< DynamicMappingFilter > registration = new FilterRegistrationBean<>();
110-
registration.setFilter( filter );
107+
registration.setFilter( new DynamicMappingFilter() );
111108
registration.setUrlPatterns( urlPatternsForStripesDynamicFilter );
112109
registration.setDispatcherTypes( DispatcherType.REQUEST, DispatcherType.INCLUDE, DispatcherType.FORWARD, DispatcherType.ERROR );
113110
registration.setOrder( Ordered.LOWEST_PRECEDENCE );
@@ -117,15 +114,15 @@ public FilterRegistrationBean< DynamicMappingFilter > stripesDynamicFilter( @Qua
117114
@Bean( "urlPatternsForStripesFilter" )
118115
@ConditionalOnMissingBean( name = "urlPatternsForStripesFilter" )
119116
public List< String > urlPatternsForStripesFilter() {
120-
final List< String > urlPatterns = new ArrayList< String >();
117+
final List< String > urlPatterns = new ArrayList<>();
121118
urlPatterns.add( "*.jsp" );
122119
return urlPatterns;
123120
}
124121

125122
@Bean( "urlPatternsForStripesDynamicFilter" )
126123
@ConditionalOnMissingBean( name = "urlPatternsForStripesDynamicFilter" )
127124
public List< String > urlPatternsForStripesDynamicFilter() {
128-
final List< String > urlPatterns = new ArrayList< String >();
125+
final List< String > urlPatterns = new ArrayList<>();
129126
urlPatterns.add( "/*" );
130127
return urlPatterns;
131128
}
@@ -139,7 +136,7 @@ void setActionResolverPackages( final Map< String, String > params, final String
139136
}
140137

141138
String locateActionResolverPackages() {
142-
final StripesClassesScanner< ActionBean > scanner = new StripesClassesScanner< ActionBean >();
139+
final StripesClassesScanner< ActionBean > scanner = new StripesClassesScanner<>();
143140
scanner.addIncludeFilter( new AssignableTypeFilter( ActionBean.class ) );
144141
final Collection< Class< ? extends ActionBean > > actionbeans = scanner.findComponentClasses( BASE_PKG );
145142
final String packages = scanner.toPackagesWithoutStripesClasses( actionbeans );
@@ -152,6 +149,29 @@ String locateActionResolverPackages() {
152149
return packages;
153150
}
154151

152+
void setExceptionHandler( final Map< String, String > params, final String key, final String value ) {
153+
if( StringUtils.isEmpty( value ) ) {
154+
putIfNotEmpty( params, key, locateExceptionHandler() );
155+
} else {
156+
putIfNotEmpty( params, key, value );
157+
}
158+
}
159+
160+
String locateExceptionHandler() {
161+
final StripesClassesScanner< ExceptionHandler > scanner = new StripesClassesScanner<>();
162+
scanner.addIncludeFilter( new AssignableTypeFilter( ExceptionHandler.class ) );
163+
final Collection< Class< ? extends ExceptionHandler > > exceptionHandlers = scanner.findComponentClasses( BASE_PKG );
164+
final String exceptionHandler = scanner.selectFirstConcreteConfigurationClass( exceptionHandlers );
165+
if( !StringUtils.isEmpty( exceptionHandler ) ) {
166+
LOG.warn( "Didn't found any ExceptionHandler, defaulting to net.sourceforge.stripes.exception.DefaultExceptionHandler;" +
167+
"check your application build and optionally your stripes.exception-handler property on application.properties" );
168+
return null;
169+
} else {
170+
LOG.info( "Detected ExceptionHandlers on " + scanner.toPackagesWithoutStripesClasses( exceptionHandlers ) + " selected " + exceptionHandler );
171+
return exceptionHandler;
172+
}
173+
}
174+
155175
void defaultIfEmpty( final Map< String, String > params, final String key, final String value, final String def ) {
156176
if( StringUtils.isEmpty( value ) ) {
157177
putIfNotEmpty( params, key, def );

stripes-spring-boot-autoconfigure/src/main/java/net/sourceforge/stripes/springboot/autoconfigure/StripesClassesScanner.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package net.sourceforge.stripes.springboot.autoconfigure;
22

33
import java.io.IOException;
4+
import java.lang.reflect.Modifier;
45
import java.util.ArrayList;
56
import java.util.Arrays;
67
import java.util.Collection;
@@ -106,6 +107,15 @@ String toPackagesWithoutStripesClasses( final Collection< Class< ? extends T > >
106107
return StringUtils.collectionToCommaDelimitedString( packages );
107108
}
108109

110+
public String selectFirstConcreteConfigurationClass( final Collection< Class< ? extends T > > classes ) {
111+
for( final Class< ? extends T > clase : classes ) {
112+
if( !fromStripesLibrary( clase ) && !Modifier.isAbstract( clase.getModifiers() ) && !clase.isInterface() ) {
113+
return clase.getName();
114+
}
115+
}
116+
return null;
117+
}
118+
109119
String toPackages( final Collection< Class< ? extends T > > classes ) {
110120
final Set< String > packages = new HashSet< String >();
111121
for( final Class< ? extends T > clase : classes ) {

stripes-spring-boot-sample/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
<properties>
1919
<build.timestamp>${maven.build.timestamp}</build.timestamp>
20+
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
2021
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2122
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
2223
</properties>
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# after either mvn spring-boot:run or java-jar target/stripes-spring-boot-sample-1.0.0.jar
2-
# open http://localhost:8080/index.jsp in your browser
2+
# open http://localhost:8080/index.jsp or http://localhost:8080/actuator/stripes in your browser
33

4-
# uncomment the following line to substantially speed up initialization time
5-
# stripes.action-resolver-packages=net.sourceforge.stripes.examples.springboot
4+
# uncomment the following lines to substantially speed up initialization time
5+
stripes.action-resolver-packages=net.sourceforge.stripes.examples.springboot
6+
stripes.exception-handler=net.sourceforge.stripes.exception.DefaultExceptionHandler
67

78
# enforce same encryption key if running several app instances:
8-
stripes.encryption-key=${build.timestamp}
99
management.endpoints.web.exposure.include=info,health,stripes

0 commit comments

Comments
 (0)