[
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