2014-03-19 62 views
0

我想定制我的应用程序来处理由一个Webflow扔一个例外接口,异常是SpelEvaluationExceptionEvaluationException的especialization。与文档根据我实现的接口FlowExecutionExceptionHandler并留校象下面这样:如何实现FlowExecutionExceptionHandler

@Named 
public class PerfilExceptionHandler implements FlowExecutionExceptionHandler { 

private static final Logger LOGGER = LoggerFactory.getLogger(PerfilExceptionHandler.class); 

@Override 
public boolean canHandle(final FlowExecutionException exception) { 
    return exception.getCause() instanceof EvaluationException; 
} 

@Override 
public void handle(final FlowExecutionException exception, final RequestControlContext context) { 

    LOGGER.info("handling exception {}", exception.getMessage()); 

    TransitionExecutingFlowExecutionExceptionHandler handler = new TransitionExecutingFlowExecutionExceptionHandler(); 

    handler.add(CustomException.class, "error"); 
} 

}

然后,我已经收到了NullPoinerException,遵循堆栈跟踪:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
br.com.company.portal.web.filter.NegarAcessoSemPerfilAtivoFilter.doFilterInternal(NegarAcessoSemPerfilAtivoFilter.java:49) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:65) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:144) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
org.springframework.security.config.debug.DebugFilter.invokeWithWrappedRequest(DebugFilter.java:69) 
org.springframework.security.config.debug.DebugFilter.doFilter(DebugFilter.java:58) 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96 

如果有人能帮助我,我很高兴

编辑1

普拉萨德

下面的代码:

<view-state id="perfil" view="/perfil/add"> 
    <on-entry> 
     <set name="flowScope.urlRedirect" value="requestParameters.url"/> 
     <set name="flowScope.mapSistemaPerfis" value="perfilServiceImpl.buscarSistemasComPefis(requestParameters.identificador, requestParameters.idProduto)" /> 
    </on-entry> 

    <transition on="submit" to="savePerfil" /> 
    <exception-handler bean="perfilExceptionHandler"/> 
</view-state> 

当用户没有通过调用方法buscarSistemasComPerfis

韩国社交协会提前所需的请求参数将出现错误

+0

嗨,你可以张贴在什么情况下你得到SpelEvaluationException,因为这将发生在表达不正确或引用不正确的字段。首先处理这种情况将是理想的。 – Prasad

+0

Prasad我编辑帖子 –

回答

0

I面包车,

由于requestParameters的不存在,当SPEL解析器得到表达,它会看到这样的:

 perfilServiceImpl.buscarSistemasComPefis(,); 

,所以你得到SpelEvaluationException。 变通方法来处理这种类型的场景是:

<view-state id="perfil" view="/perfil/add"> 
<on-entry> 
    <set name="flowScope.urlRedirect" value="requestParameters.url"/> 
    <set name="requestScope.identificador" value="requestParameters.identificador" type="string"/> 
    <set name="requestScope.idProduto" value="requestParameters.idProduto" type="string"/> 
    <set name="flowScope.mapSistemaPerfis" value="perfilServiceImpl.buscarSistemasComPefis(requestScope.identificador, requestScope.idProduto)" /> 
</on-entry> 

<transition on="submit" to="savePerfil" /> 
<exception-handler bean="perfilExceptionHandler"/> 

即使requestParameters的不通过这种方式,你的方法接收参数为空值,您可以相应地处理。

+0

Prasad,我的问题不是SpelEvaluationException。我不关心会抛出什么异常,但是,当我在执行方法句柄(FlowExecutionException,RequestControlContext)后处理流执行时,我关心NullPointerException。我测试了在请求范围内设置请求参数的问题,但问题仍然存在 –

+0

如果所有请求都输入perfilServiceImpl.buscarSistemasComPefis(requestScope.identificador,requestScope.idProduto)方法,您可以通过打开调试模式进行检查吗? – Prasad

+0

我进入调试模式,但是,我没有看到任何不同。我把一个断点和方法perfilServiceImpl.buscarSistemasComPefis(requestScope.identificador,requestScope.idProduto)没有调用。也许这部分可以用来处理异常抛出异常执行[AnnotatedAction @ 35c86c73 targetAction = [SetAction @ 79480d9a name = flowScope.mapSistemaPerfis,value = perfilServiceImpl.buscarSistemasComPefis(requestScope.identificador,requestScope.idProduto)],attributes = map [[empty] ]]在'perfil'状态'perfil'流'perfil' - 动作执行属性是'map [[empty]]' –

2

无需实现FlowExecutionExceptionHandler,尽量TransitionExecutingFlowExecutionExceptionHandler像下方延伸:

public class PerfilExceptionHandler extends 
     TransitionExecutingFlowExecutionExceptionHandler { 

而且,你给

handler.add(CustomException.class, "error"); 
  1. 你有没有在你的Webflow定义的目标状态ID “错误”定义?
  2. 在TransitionExecutingFlowExecutionExceptionHandler中使用add()。 exposeException()方法定义对于识别特定异常的目标状态标识非常有用。