Skip to content

Commit

Permalink
Exception Handler auto-detection
Browse files Browse the repository at this point in the history
  • Loading branch information
juanpablo-santos committed Jul 16, 2018
1 parent fa4e8b5 commit 2e7f6a5
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 15 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,9 @@ By default, Stripes Dynamic Filter map to `/*`, whereas Stripes Filter maps to `
* [2.0.0](https://github.com/juanpablo-santos/stripes-spring-boot/releases/tag/2.0.0)
* [Support for Spring Boot 2](https://github.com/juanpablo-santos/stripes-spring-boot/issues/4)
* New Stripes Actuator Endpoint detailing Stripes' filters configuration
* Exception Handler autodetection
* Can run side by side with Spring MVC, no need to set any property on your `application.properties` file
* Faster startup time if `stripes.action-resolver-packages` is set on your `application.properties` file
* Faster startup time if `stripes.action-resolver-packages` and/or `stripes.exception-handler` are set on your `application.properties` file

* [1.1.0](https://github.com/juanpablo-santos/stripes-spring-boot/releases/tag/1.1.0)
* Update to latest 1.5 Spring Boot release
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import net.sourceforge.stripes.action.ActionBean;
import net.sourceforge.stripes.controller.DynamicMappingFilter;
import net.sourceforge.stripes.controller.StripesFilter;
import net.sourceforge.stripes.exception.ExceptionHandler;
import net.sourceforge.stripes.util.Log;


Expand Down Expand Up @@ -58,9 +59,7 @@ public StripesEndpoint stripesEndpoint( final FilterRegistrationBean< StripesFil
@Bean( name = "stripesFilter" )
@ConditionalOnMissingBean( name = "stripesFilter" )
public FilterRegistrationBean< StripesFilter > stripesFilter( @Qualifier( "urlPatternsForStripesFilter" ) final List< String > urlPatternsForStripesFilter ) {
final StripesFilter filter = new StripesFilter();

final Map< String, String > params = new HashMap< String, String >();
final Map< String, String > params = new HashMap<>();
setActionResolverPackages( params, "ActionResolver.Packages", properties.getActionResolverPackages() );
putIfNotEmpty( params, "ActionBeanPropertyBinder.Class", properties.getActionBeanPropertyBinder() );
putIfNotEmpty( params, "ActionBeanContext.Class", properties.getActionBeanContext() );
Expand Down Expand Up @@ -93,7 +92,7 @@ public FilterRegistrationBean< StripesFilter > stripesFilter( @Qualifier( "urlPa
}

final FilterRegistrationBean< StripesFilter > registration = new FilterRegistrationBean<>();
registration.setFilter( filter );
registration.setFilter( new StripesFilter() );
registration.setInitParameters( params );
registration.setUrlPatterns( urlPatternsForStripesFilter );
registration.setDispatcherTypes( DispatcherType.REQUEST );
Expand All @@ -104,10 +103,8 @@ public FilterRegistrationBean< StripesFilter > stripesFilter( @Qualifier( "urlPa
@Bean( name = "stripesDynamicFilter" )
@ConditionalOnMissingBean( name = "stripesDynamicFilter" )
public FilterRegistrationBean< DynamicMappingFilter > stripesDynamicFilter( @Qualifier( "urlPatternsForStripesDynamicFilter" ) final List< String > urlPatternsForStripesDynamicFilter ) {
final DynamicMappingFilter filter = new DynamicMappingFilter();

final FilterRegistrationBean< DynamicMappingFilter > registration = new FilterRegistrationBean<>();
registration.setFilter( filter );
registration.setFilter( new DynamicMappingFilter() );
registration.setUrlPatterns( urlPatternsForStripesDynamicFilter );
registration.setDispatcherTypes( DispatcherType.REQUEST, DispatcherType.INCLUDE, DispatcherType.FORWARD, DispatcherType.ERROR );
registration.setOrder( Ordered.LOWEST_PRECEDENCE );
Expand All @@ -117,15 +114,15 @@ public FilterRegistrationBean< DynamicMappingFilter > stripesDynamicFilter( @Qua
@Bean( "urlPatternsForStripesFilter" )
@ConditionalOnMissingBean( name = "urlPatternsForStripesFilter" )
public List< String > urlPatternsForStripesFilter() {
final List< String > urlPatterns = new ArrayList< String >();
final List< String > urlPatterns = new ArrayList<>();
urlPatterns.add( "*.jsp" );
return urlPatterns;
}

@Bean( "urlPatternsForStripesDynamicFilter" )
@ConditionalOnMissingBean( name = "urlPatternsForStripesDynamicFilter" )
public List< String > urlPatternsForStripesDynamicFilter() {
final List< String > urlPatterns = new ArrayList< String >();
final List< String > urlPatterns = new ArrayList<>();
urlPatterns.add( "/*" );
return urlPatterns;
}
Expand All @@ -139,7 +136,7 @@ void setActionResolverPackages( final Map< String, String > params, final String
}

String locateActionResolverPackages() {
final StripesClassesScanner< ActionBean > scanner = new StripesClassesScanner< ActionBean >();
final StripesClassesScanner< ActionBean > scanner = new StripesClassesScanner<>();
scanner.addIncludeFilter( new AssignableTypeFilter( ActionBean.class ) );
final Collection< Class< ? extends ActionBean > > actionbeans = scanner.findComponentClasses( BASE_PKG );
final String packages = scanner.toPackagesWithoutStripesClasses( actionbeans );
Expand All @@ -152,6 +149,29 @@ String locateActionResolverPackages() {
return packages;
}

void setExceptionHandler( final Map< String, String > params, final String key, final String value ) {
if( StringUtils.isEmpty( value ) ) {
putIfNotEmpty( params, key, locateExceptionHandler() );
} else {
putIfNotEmpty( params, key, value );
}
}

String locateExceptionHandler() {
final StripesClassesScanner< ExceptionHandler > scanner = new StripesClassesScanner<>();
scanner.addIncludeFilter( new AssignableTypeFilter( ExceptionHandler.class ) );
final Collection< Class< ? extends ExceptionHandler > > exceptionHandlers = scanner.findComponentClasses( BASE_PKG );
final String exceptionHandler = scanner.selectFirstConcreteConfigurationClass( exceptionHandlers );
if( !StringUtils.isEmpty( exceptionHandler ) ) {
LOG.warn( "Didn't found any ExceptionHandler, defaulting to net.sourceforge.stripes.exception.DefaultExceptionHandler;" +
"check your application build and optionally your stripes.exception-handler property on application.properties" );
return null;
} else {
LOG.info( "Detected ExceptionHandlers on " + scanner.toPackagesWithoutStripesClasses( exceptionHandlers ) + " selected " + exceptionHandler );
return exceptionHandler;
}
}

void defaultIfEmpty( final Map< String, String > params, final String key, final String value, final String def ) {
if( StringUtils.isEmpty( value ) ) {
putIfNotEmpty( params, key, def );
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.sourceforge.stripes.springboot.autoconfigure;

import java.io.IOException;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -106,6 +107,15 @@ String toPackagesWithoutStripesClasses( final Collection< Class< ? extends T > >
return StringUtils.collectionToCommaDelimitedString( packages );
}

public String selectFirstConcreteConfigurationClass( final Collection< Class< ? extends T > > classes ) {
for( final Class< ? extends T > clase : classes ) {
if( !fromStripesLibrary( clase ) && !Modifier.isAbstract( clase.getModifiers() ) && !clase.isInterface() ) {
return clase.getName();
}
}
return null;
}

String toPackages( final Collection< Class< ? extends T > > classes ) {
final Set< String > packages = new HashSet< String >();
for( final Class< ? extends T > clase : classes ) {
Expand Down
1 change: 1 addition & 0 deletions stripes-spring-boot-sample/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

<properties>
<build.timestamp>${maven.build.timestamp}</build.timestamp>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# after either mvn spring-boot:run or java-jar target/stripes-spring-boot-sample-1.0.0.jar
# open http://localhost:8080/index.jsp in your browser
# open http://localhost:8080/index.jsp or http://localhost:8080/actuator/stripes in your browser

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

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

0 comments on commit 2e7f6a5

Please sign in to comment.