我想在一个控制器中处理所有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处理中,虽然执行了异常处理程序方法,但是没有呈现异常视图。