Spring @ExceptionHandler无法正常工作

时间:2015-11-11 15:34:03

标签: spring spring-mvc

我正在尝试使用@ExceptionHandler处理异常,但它无法正常工作,我不知道为什么。事情是现在我从我的网络服务得到这个回复:{"消息":" 2013-02-30提供的日期无效","代码&#34 ; 500" IDS":空}。我希望这是一个400例外而不是500例。 这是我的代码:

@Controller
public class WsController {
    @RequestMapping(value={"/getDeletedUsers"}, method=RequestMethod.GET)
    public List<Integer> getDeletedUsers(@RequestParam(value = "date", required = true) String dateStr) throws WebServiceException {
        if (dateStr == null) {
            throw new WebServiceException("The date provided is null");
        } else if (StringUtils.isEmpty(dateStr)) {
            throw new WebServiceException("The date provided is empty");
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat();
            sdf.applyPattern("yyyy-MM-dd");
            sdf.setLenient(false);
            try {
                sdf.parse(dateStr);
            } catch (ParseException e) {
                throw new WebServiceException("The date provided " + dateStr + " is invalid");
            }
            return service.getDeletedUsers(dateStr);
        }
    }

    @ExceptionHandler(WebServiceException.class)
    public void handleWebServiceException() {
        System.out.println("PLEASE DO SOMETHING!");
    }
}

public class WebServiceException extends Exception {
    //Constructors and serialVersionUID
}

disparcher-servlet.xml中

<?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:tx="http://www.springframework.org/schema/tx"
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="searchContextAttributes" value="true"/>
    <property name="contextOverride" value="true"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>file:c://rt//properties//webservices-application.properties</value>
        </list>
    </property>
</bean>

<import resource="classpath:keepalive.xml" />
<import resource="classpath:controller.xml" />

<bean id="exceptionResolver" class="com.company.project.webservices.spring.ExceptionResolver"/>

<bean id="error" class="com.company.project.webservices.spring.ErrorView"/>
<bean id="readOnlyModeError" class="com.company.project.webservices.spring.ReadOnlyModeErrorView"/>
<bean id="methodUnavailableError" class="com.company.project.webservices.spring.MethodUnavailableErrorView"/>
<bean id="badRequestError" class="com.company.project.webservices.spring.BadRequestErrorView"/>

<!-- View Resolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="order" value="1" />
  <property name="mediaTypes">
    <map>
        <entry key="json" value="application/json"/>
    </map>
  </property>
      <!-- Ticket-3245 Spring 60 -->
      <property name="defaultContentType" value="application/json" />
      <property name="useNotAcceptableStatusCode" value="true"/>
  <property name="viewResolvers">
    <list>
      <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="2" />
      </bean>
    </list>
  </property>
  <property name="defaultViews">
    <list>        
      <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    </list>
  </property>
</bean>

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="messages"/>
</bean>

<!-- Dispatches requests mapped to POJO @Controllers implementations -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <util:list id="beanList">
            <ref bean="jsonHttpMessageConverter"/>
        </util:list>
    </property>
</bean>

<bean id="jsonHttpMessageConverter" 
   class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
</bean>


<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false"/>
</bean>

<!-- Dispatches requests mapped to non-annotated controllers -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

<context:annotation-config/>    
<context:component-scan base-package="com.company.project" />

当我尝试调试handleWebServiceException方法时,它甚至不会停在那里。 任何提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

正如jny建议的那样,我看了一下dispatcher-servlet.xml,发现有一个我没见过的exceptionResolver bean看起来像这样:

public class ExceptionResolver extends AbstractHandlerExceptionResolver {

private static Log logger = LogFactory.getLog(ExceptionResolver.class);

@Override
protected ModelAndView doResolveException(HttpServletRequest request,
        HttpServletResponse response, Object handler, Exception ex) {
    ModelAndView mv = null;
    if (ex instanceof ReadOnlyModeException) {
        mv = new ModelAndView("readOnlyModeError");
    } else if (ex instanceof MethodUnavailableException) {
        mv = new ModelAndView("methodUnavailableError");
    } else if (ex instanceof BadRequestException) {
        mv = new ModelAndView("badRequestError");
    } else {
        logger.error("caught an exception: ", ex);
        mv = new ModelAndView("error");
    }
    ResultBean resultBean = new ResultBean();
    resultBean.setCode(500);
    resultBean.setMessage(ex.getMessage());
    mv.addObject("result", resultBean);
    return mv;
}

}

在那里,我能够做出适当的改变。 再次感谢jny提示。