我有一个使用Spring构建的网站,以及一个使用Log4J的日志引擎。一切都记录正常,除了像这样的JSP中的错误:
<button class="emptybutton" data-toggle="modal" data-target="#modal7">
<h2>Hover effect 7</h2>
<p>
<a href="#"><i class="fa fa-twitter"></i></a>
<a href="#"><i class="fa fa-facebook"></i></a>
<a href="#"><i class="fa fa-instagram"></i></a>
<a href="#"><i class="fa fa-dribbble"></i></a>
</p>
</button>
错误出现在Eclipse控制台中,但不出现在log4j默认文件中。有什么想法吗?
非常感谢!
编辑: 我的log4j配置文件:
org.apache.jasper.JasperException: /views/user/registration_form.jsp (line: 80, column: 107)
编辑2 :更准确地说,我们能够在Spring MVC应用程序中处理任何异常,除了视图页面抛出的异常(例如JasperException)。
答案 0 :(得分:1)
首先要尝试的是配置org.springframework.web.servlet.handler.SimpleMappingExceptionResolver
来处理JasperException(或者任何类型的事情?)。
奇怪的是,我无法让它工作(它似乎根本不涉及堆栈)。
某种东西:
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
p:defaultErrorView="uncaughtException">
<property name="exceptionMappings">
<props>
<prop key=".AccessDeniedException">error403</prop>
<prop key=".DataAccessException">error500</prop>
<prop key=".NoSuchRequestHandlingMethodException">error404</prop>
<prop key=".TypeMismatchException">error404</prop>
<prop key=".MissingServletRequestParameterException">error404</prop>
<prop key=".TimeoutException">errorTimeout</prop>
<prop key=".JasperException">error500</prop>
</props>
</property>
<property name="warnLogCategory"
value="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" />
<property name="defaultStatusCode" value="500" />
</bean>
如果这还不够,您可以随时指定自己的SimpleMappingExceptionResolver
扩展名。
现在,如果它根本不起作用(它不适合我),你可以提供自己的javax.servlet.Filter
,这肯定会有效(尽管可能不是“最好的”方式)。
类似的东西:
public class MyExceptionHandlerFilter extends GenericFilterBean {
public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, javax.servlet.FilterChain chain) throws java.io.IOException ,javax.servlet.ServletException {
try {
chain.doFilter(request, response);
} catch (Exception e) {
// do something with the exception here...
}
}
}
在Spring 3/4 Java Config中,您可以将该类放在@Configuration类中,如下所示:
@Configuration
public class MyConfig {
...
@Bean
public Filter exceptionSink() {
return new MyExceptionHandlerFilter();
}
...
}
(在春天真的有一千种方法......像往常一样)。
如果你使用web.xml
,它看起来像这样:
<filter>
<filter-name>ExceptionHandlerFilter</filter-name>
<filter-class>com.test.MyExceptionHandlerFilter</filter-class>
</filter>
...
<filter-mapping>
<filter-name>ExceptionHandlerFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果您可以提供错误的堆栈跟踪,它可能会对您的过滤器链有所了解(将在那里寻找任何“springframework”类)以查看是否可能有更简洁/更多的弹簧方式去做吧。根据您的配置,链将有所不同(例如,如果您正在使用它,可能会看到一些弹簧安全过滤器等。)
答案 1 :(得分:0)
我认为JasperExecption正在写入STDERR,这可能就是他们出现在你的eclipse控制台日志中的原因。你能看到catalina.out日志文件中的消息(/logs/catalina.yyyy-mm-dd.out)吗?
您可以尝试将以下内容添加到errorfile appender配置中以捕获错误日志中的消息。
log4j.appender.errorfile.Target=System.err