[ 
http://www.stripesframework.org/jira/browse/STS-540?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=11337#action_11337
 ] 

Jarek Lipski commented on STS-540:
----------------------------------

I think I created a fix for this bug. It is very similar to previous 
LocalizableError NullPointerException bug. I just check if beanclass is null in 
places where NullPointerException can be thrown in getMessageTemplate().

I work in the same team as Roberto, and we needed to make it work as fast as 
possible. The code had thrown exception when I tried to display validation 
errors in an interceptor. This is not a very common case, but the application 
should not throw NullPointerException here, I think.

Here's the new getMessageTemplate method:

    /**
     * Overrides getMessageTemplate to perform a scoped search for a message 
template as defined
     * in the class level javadoc.
     */
    @Override
    protected String getMessageTemplate(Locale locale) {
        String name1=null, name2=null, name3=null, name4=null, name5=null, 
name6=null,
               name7=null, name8=null, name9=null, name10=null, name11=null;

        final String actionPath = getActionPath();
        final String fieldName = getFieldName();

        String template = null;
        if (getBeanclass() != null) {
            // 1. com.myco.KittenDetailActionBean.age.outOfRange
            name1 = getBeanclass().getName() + "." + fieldName + "." + this.key;
            template = LocalizationUtility.getErrorMessage(locale, name1);
        }
        if (template == null && getBeanclass() != null) {
            // 2. com.myco.KittenDetailActionBean.age.errorMessage
            name2 = getBeanclass().getName() + "." + fieldName + "." + 
DEFAULT_NAME;
            template = LocalizationUtility.getErrorMessage(locale, name2);
        }
        if (template == null) {
            // 3. /cats/KittenDetail.action.age.outOfRange
            name3 = actionPath + "." + fieldName + "." + this.key;
            template = LocalizationUtility.getErrorMessage(locale, name3);
        }
        if (template == null) {
            // 4. /cats/KittenDetail.action.age.errorMessage
            name4 = actionPath + "." + fieldName + "." + DEFAULT_NAME;
            template = LocalizationUtility.getErrorMessage(locale, name4);
        }
        if (template == null) {
            // 5. age.outOfRange
            name5 = fieldName + "." + this.key;
            template = LocalizationUtility.getErrorMessage(locale, name5);
        }
        if (template == null) {
            // 6. age.errorMessage
            name6 = fieldName + "." + DEFAULT_NAME;
            template = LocalizationUtility.getErrorMessage(locale, name6);
        }
        if (template == null && getBeanclass() != null) {
            // 7. com.myco.KittenDetailActionBean.outOfRange
            name7 = getBeanclass().getName() + "." + this.key;
            template = LocalizationUtility.getErrorMessage(locale, name7);
        }
        if (template == null && getBeanclass() != null) {
            // 8. com.myco.KittenDetailActionBean.outOfRange
            name8 = getBeanclass().getName() + "." + DEFAULT_NAME;
            template = LocalizationUtility.getErrorMessage(locale, name8);
        }
        if (template == null) {
            // 9. /cats/KittenDetail.action.outOfRange
            name9 = actionPath + "." + this.key;
            template = LocalizationUtility.getErrorMessage(locale, name9);
        }
        if (template == null) {
            // 10. /cats/KittenDetail.action.errorMessage
            name10 = actionPath + "." + DEFAULT_NAME;
            template = LocalizationUtility.getErrorMessage(locale, name10);
        }
        if (template == null) {
            // 11. converter.integer.outOfRange
            name11 = this.defaultScope + "." + this.key;
            template = LocalizationUtility.getErrorMessage(locale, name11);
        }

        if (template == null) {
            throw new MissingResourceException(
                    "Could not find an error message with any of the following 
keys: " +
                    "'" + name1 + "', '" + name2 + "', '" + name3 + "', '" +
                    name4 + "', '" + name5 + "', '" + name6 + "', '" + name7 + 
"'." +
                    name8 + "', '" + name9 + "', '" + name10 + "', '" + name11 
+ "'.", null, null
            );
        }

        return template;
    }



And here's the unified patch (changes are so simple that i think it's better to 
apply them by hand than using patch):

--- ScopedLocalizableError.java 2008-04-15 17:50:41.000000000 +0200
+++ ScopedLocalizableError.java.new     2008-04-15 17:54:57.000000000 +0200
@@ -85,16 +85,17 @@
                name7=null, name8=null, name9=null, name10=null, name11=null;
 
         final String actionPath = getActionPath();
-        final String fqn = getBeanclass().getName();
         final String fieldName = getFieldName();
 
-        // 1. com.myco.KittenDetailActionBean.age.outOfRange
-        name1 = fqn + "." + fieldName + "." + this.key;
-        String template = LocalizationUtility.getErrorMessage(locale, name1);
-
-        if (template == null) {
+        String template = null;
+        if (getBeanclass() != null) {
+            // 1. com.myco.KittenDetailActionBean.age.outOfRange
+            name1 = getBeanclass().getName() + "." + fieldName + "." + 
this.key;
+            template = LocalizationUtility.getErrorMessage(locale, name1);
+        }
+        if (template == null && getBeanclass() != null) {
             // 2. com.myco.KittenDetailActionBean.age.errorMessage
-            name2 = fqn + "." + fieldName + "." + DEFAULT_NAME;
+            name2 = getBeanclass().getName() + "." + fieldName + "." + 
DEFAULT_NAME;
             template = LocalizationUtility.getErrorMessage(locale, name2);
         }
         if (template == null) {
@@ -117,14 +118,14 @@
             name6 = fieldName + "." + DEFAULT_NAME;
             template = LocalizationUtility.getErrorMessage(locale, name6);
         }
-        if (template == null) {
+        if (template == null && getBeanclass() != null) {
             // 7. com.myco.KittenDetailActionBean.outOfRange
-            name7 = fqn + "." + this.key;
+            name7 = getBeanclass().getName() + "." + this.key;
             template = LocalizationUtility.getErrorMessage(locale, name7);
         }
-        if (template == null) {
+        if (template == null && getBeanclass() != null) {
             // 8. com.myco.KittenDetailActionBean.outOfRange
-            name8 = fqn + "." + DEFAULT_NAME;
+            name8 = getBeanclass().getName() + "." + DEFAULT_NAME;
             template = LocalizationUtility.getErrorMessage(locale, name8);
         }
         if (template == null) {

> java.lang.NullPointerException in 
> net.sourceforge.stripes.validation.ScopedLocalizableError.getMessageTemplate
> --------------------------------------------------------------------------------------------------------------
>
>                 Key: STS-540
>                 URL: http://www.stripesframework.org/jira/browse/STS-540
>             Project: Stripes
>          Issue Type: Bug
>          Components: Validation
>    Affects Versions: Release 1.5
>            Reporter: Roberto
>
> The problem looks very similar to NullPointerException in LocalizableError 
> fixed before (around 807 release?). It looks like beanClass is not set and is 
> null.
> log messages:
> 2008-04-09 15:34:18,756 [http-8080-Processor25] DEBUG 
> net.sourceforge.stripes.validation.SimpleError - debug      - Looking up 
> localized field name with messageKey: fonte.frequenzaPubblicazione
> 2008-04-09 15:34:18,756 [http-8080-Processor25] DEBUG 
> net.sourceforge.stripes.controller.ExecutionContext - debug      - 
> Transitioning to lifecycle stage RequestComplete
> 2008-04-09 15:34:18,756 [http-8080-Processor25] WARN  
> net.sourceforge.stripes.exception.DefaultExceptionHandler - warn       - 
> Unhandled exception caught by the Stripes default exception handler.
> java.lang.NullPointerException
>       at 
> net.sourceforge.stripes.validation.ScopedLocalizableError.getMessageTemplate(ScopedLocalizableError.java:88)
>       at 
> net.sourceforge.stripes.action.SimpleMessage.getMessage(SimpleMessage.java:91)
>       at 
> net.sourceforge.stripes.validation.SimpleError.getMessage(SimpleError.java:102)
>       at 
> it.phoenix.web.interceptors.ErrorLoggingInterceptor.logValidationErrors(ErrorLoggingInterceptor.java:66)
>       at 
> it.phoenix.web.interceptors.ErrorLoggingInterceptor.intercept(ErrorLoggingInterceptor.java:43)
>       at 
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
>       at 
> net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:111)
>       at 
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
>       at 
> net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
>       at 
> net.sourceforge.stripes.controller.DispatcherHelper.doBindingAndValidation(DispatcherHelper.java:190)
>       at 
> net.sourceforge.stripes.controller.DispatcherServlet.doBindingAndValidation(DispatcherServlet.java:264)
>       at 
> net.sourceforge.stripes.controller.DispatcherServlet.doPost(DispatcherServlet.java:155)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:248)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> it.phoenix.security.filters.FormSecurityFilter.doFilter(FormSecurityFilter.java:193)
>       at 
> it.phoenix.security.filters.FormSecurityFilter.doFilter(FormSecurityFilter.java:105)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>       at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
>       at 
> org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
>       at 
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
>       at 
> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
>       at 
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
>       at java.lang.Thread.run(Thread.java:595)
> 2008-04-09 15:34:18,771 [http-8080-Processor25] ERROR 
> org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/kijijiweb].[StripesDispatcher]
>  - invoke     - Servlet.service() for servlet StripesDispatcher threw 
> exception
> java.lang.NullPointerException
>       at 
> net.sourceforge.stripes.validation.ScopedLocalizableError.getMessageTemplate(ScopedLocalizableError.java:88)
>       at 
> net.sourceforge.stripes.action.SimpleMessage.getMessage(SimpleMessage.java:91)
>       at 
> net.sourceforge.stripes.validation.SimpleError.getMessage(SimpleError.java:102)
>       at 
> it.phoenix.web.interceptors.ErrorLoggingInterceptor.logValidationErrors(ErrorLoggingInterceptor.java:66)
>       at 
> it.phoenix.web.interceptors.ErrorLoggingInterceptor.intercept(ErrorLoggingInterceptor.java:43)
>       at 
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
>       at 
> net.sourceforge.stripes.controller.BeforeAfterMethodInterceptor.intercept(BeforeAfterMethodInterceptor.java:111)
>       at 
> net.sourceforge.stripes.controller.ExecutionContext.proceed(ExecutionContext.java:155)
>       at 
> net.sourceforge.stripes.controller.ExecutionContext.wrap(ExecutionContext.java:74)
>       at 
> net.sourceforge.stripes.controller.DispatcherHelper.doBindingAndValidation(DispatcherHelper.java:190)
>       at 
> net.sourceforge.stripes.controller.DispatcherServlet.doBindingAndValidation(DispatcherServlet.java:264)
>       at 
> net.sourceforge.stripes.controller.DispatcherServlet.doPost(DispatcherServlet.java:155)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
>       at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> net.sourceforge.stripes.controller.StripesFilter.doFilter(StripesFilter.java:248)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> it.phoenix.security.filters.FormSecurityFilter.doFilter(FormSecurityFilter.java:193)
>       at 
> it.phoenix.security.filters.FormSecurityFilter.doFilter(FormSecurityFilter.java:105)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>       at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>       at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>       at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
>       at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>       at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
>       at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
>       at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
>       at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
>       at 
> org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
>       at 
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
>       at 
> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
>       at 
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
>       at java.lang.Thread.run(Thread.java:595)

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://www.stripesframework.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to