全局异常处理类不起作用?

来源:6-3 接口请求全局异常处理-设计与验证

北斗神拳1984

2018-07-16

<bean id="springExceptionResolver" class="com.mmall.common.SpringExceptionResolver"/>

我没加入id属性的时候,就直接显示500异常,根本没有进入异常处理类,但是老师课程里没加id也是正常的。

为什么我的环境会出现这种情况呢?

写回答

7回答

Jimin

2018-07-16

你现在这个代码最后出来的不是json格式?如果返回的是json格式的话,那就说明没问题了。你是在SpringExceptionResolver里加断点,抛异常后,调试的代码没走到吗?
0
1
北斗神拳1984
调试过了抛异常后根本没有走到SpringExceptionResolver,加了在配置里加个id属性,就能走到,不知道什么原因。
2018-07-16
共1条回复

北斗神拳1984

提问者

2018-07-16

package com.mmall.common;

import com.mmall.exception.ParamException;
import com.mmall.exception.PermissionException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
public class SpringExceptionResolver implements HandlerExceptionResolver {
   @Override
   public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
       String url = request.getRequestURL().toString();
       ModelAndView mv;
       String defaultMsg = "System error";

       //.json请求json的接口,.page请求页面的接口
       //这里我们要求项目中所有请求json数据,都使用.json结尾
       if (url.endsWith(".json")){
           if (ex instanceof PermissionException || ex instanceof ParamException){
               JsonData result = JsonData.fail(ex.getMessage());
               mv = new ModelAndView("jsonView",result.toMap());
           }else {
               log.error("unknown json exception,url"+url,ex);
               JsonData result = JsonData.fail(defaultMsg);
               mv = new ModelAndView("jsonView",result.toMap());
           }
       }else if (url.endsWith(".page")){//这里我们要求项目中所有请求page页面,都使用.page结尾
           log.error("unknown page exception,url"+url,ex);
           JsonData result = JsonData.fail(defaultMsg);
           mv = new ModelAndView("exception",result.toMap());
       }else {
           log.error("unknown exception,url"+url,ex);
           JsonData result = JsonData.fail(defaultMsg);
           mv = new ModelAndView("jsonView",result.toMap());
       }
       return mv;
   }
}

0
0

北斗神拳1984

提问者

2018-07-16

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
      xmlns:mvc="http://www.springframework.org/schema/mvc"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">


   <context:annotation-config />

   <!-- 启动注解驱动的springMVC功能 -->
   <mvc:annotation-driven/>

   <!-- 启动包扫描 -->
   <context:component-scan base-package="com.mmall.controller"/>
   <context:component-scan base-package="com.mmall.service"/>

   <!-- 处理requestMapping的映射和视图的解析 -->
   <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>-->
   <bean class="com.mmall.common.SpringExceptionResolver"/>

   <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

   <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/views/"/>
       <property name="suffix" value=".jsp"/>
   </bean>

</beans>

0
0

北斗神拳1984

提问者

2018-07-16

package com.mmall.controller;

import com.mmall.common.JsonData;
import com.mmall.exception.PermissionException;
import com.mmall.param.TestVo;
import com.mmall.util.BeanValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Map;

@Controller
@RequestMapping("/test")
@Slf4j
public class TestController {

   @RequestMapping("/hello.json")
   @ResponseBody
   public JsonData hello(){
       log.info("hello");
       throw new PermissionException("test exception");
//        return JsonData.success("hello,permission");
   }


   @RequestMapping("/validate.json")
   @ResponseBody
   public JsonData validate(TestVo vo){
       log.info("validate");
       try {
           Map<String,String> map = BeanValidator.validateObject(vo);
           if (map != null && map.entrySet().size() > 0){
               for (Map.Entry<String,String> entry:map.entrySet()){
                   log.info("{}->{}",entry.getKey(),entry.getValue());
               }
           }
       }catch(Exception e){

       }
       return JsonData.success("test validate");
   }
}

0
0

Jimin

2018-07-16

你目前贴的这个异常,属于正常业务测试的异常,不是配置出现的异常。

这样吧,你把SpringExceptionResolver这个类的代码及相关的配置和测试的代码都发一下我看看吧,应该是哪里细节配置的有问题。

0
0

北斗神拳1984

提问者

2018-07-16

HTTP Status 500 - Request processing failed; nested exception is com.mmall.exception.PermissionException: test exception

type Exception report

message Request processing failed; nested exception is com.mmall.exception.PermissionException: test exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is com.mmall.exception.PermissionException: test exception
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


root cause

com.mmall.exception.PermissionException: test exception
com.mmall.controller.TestController.hello(TestController.java:19)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


note The full stack trace of the root cause is available in the Apache Tomcat/7.0.73 logs.


0
0

Jimin

2018-07-16

你好,500异常的详细堆栈情况发出来看一下

0
0

Java开发企业级权限管理系统

源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术

2261 学习 · 1347 问题

查看课程