处理Spring MVC portlet中的异常

时间:2016-02-18 15:59:26

标签: spring-mvc liferay spring-portlet-mvc

我想在一个控制器中处理所有portlet异常。春天使用@ControllerAdvice提出了这个工具。

我想知道这个功能是否仍然适用于portlet上下文。

请注意,我测试它但处理异常的方法不会触发。

提前感谢。

编辑1 这是一些代码片段

SpringMvcPortlet.java

@Controller
@RequestMapping("VIEW")
public class SpringMvcPortlet {
private static final Logger LOGGER = LoggerFactory.getLogger(SpringMvcPortlet.class);

@Autowired
private MyService myService;

@RenderMapping
public String view(final RenderRequest request, final RenderResponse response) {
    return "view";
}

@RenderMapping(params = "action=renderOne")
public String renderOne(final RenderRequest request, final RenderResponse response) {

    boolean result = myService.doSomething();
    if (!result){
        throw new InitException("CAN NOT INITIALIZE APP")
    }
    return "renderOne";
}

//Doing an Ajax call here
@ResourceMapping("initParams")
public void getInitParams(ResourceRequest request, ResourceResponse response) throws InitException{
    final JSONObject initParams = constructJsonObject();

    if (initParams == null){
        throw new InitException("CAN NOT INITIALIZE APP")
    }
    try {
        response.getWriter().write(initParams.toString());
    } catch (IOException e) {
        LOGGER.error("ERROR :: "+e)
    }
}
}

ExceptionControllerAdvice.java

@ControllerAdvice("com.xxx.yyy.portlet")
@RequestMapping(value="/") 
public class ExceptionControllerAdvice {


@ExceptionHandler(InitException.class)
public ModelAndView handleInitException(InitException e) {

    ModelAndView mav = new ModelAndView("exception");
    mav.addObject("name", e.getClass().getSimpleName());
    mav.addObject("message", e.getMessage());

    return mav;
}
}

这样,当服务返回false或执行ajax调用和ExceptionControllerAdvice时,不会触发处理initParams == null中的异常的方法。

此外,当我将handleInitException(InitException e)放入portlet控制器并在renderOne中抛出InitException时,处理异常并呈现exception.jsp视图。但是,在这种情况下,当在ajax调用(getInitParams)中抛出异常时,将执行异常处理程序方法,但不会呈现异常视图。

所以要恢复,我不知道ControllerAdvice是否在portlet上下文中可用,或者我是否遗漏了某些内容。我也不明白为什么在ajax处理中,虽然执行了异常处理程序方法,但是没有呈现异常视图。

1 个答案:

答案 0 :(得分:0)

看看这个blog

Vitor Silva在Liferay中使用REST描述了一个优雅的Spring portlet方法,并使用Extjs描述了一个富客户端架构。 (搜索ExceptionHandler)

如果你有野心,你也可以阅读这个blog并制作一个Spring Boot portlet: