在Spring中为MethodArgumentNotValidException的@ExceptionHandler添加参数

时间:2015-07-24 17:35:38

标签: java spring validation spring-mvc

我有一个Spring控制器,用hibernate验证器验证传入的请求。

当请求无效时,验证者会抛出@RequestMapping(value = "/...", method = RequestMethod.POST) @ResponseBody public Response handleCustomObject(@Valid @RequestBody CustomObject obj) { //.. } @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public Response handleInvalidRequest(MethodArgumentNotValidException e) { return getMissingMandatoryParametersResponse(e); } } 。是否可以将附加类作为参数添加到异常的处理程序方法中?

这就是我所拥有的:

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Response handleInvalidRequest(MethodArgumentNotValidException e, CustomObject obj) {

 // do something with CustomObject
}

我需要类似下面的示例,但这不起作用:

import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.jar.Attributes;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Parserusw {

    static LinkedList<String>list = new LinkedList<String>();

    public static void main(String[]args) throws ParserConfigurationException, SAXException{
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();
        DefaultHandler handler = new DefaultHandler(){


        @Override
          public void startElement(String uri, String localName,String qName,Attributes attributes) throws SAXException{
            if(qName.equals("Start"))
                Parserusw.list.add("Start");
            Parserusw.list.add("Start1");
            Parserusw.list.add("Start2");
            System.out.println("uidwwd");

        }
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            String text;
            text = String.valueOf(ch, start, length);

            if(text.equals("Ende"))
                Parserusw.list.add("Ende");


        }
        @Override
        public void endElement (String namespaceURI,String localName, String qName){
            for(String s:Parserusw.list){
                System.out.println(s);
            }
            System.out.println("uidwwd");
        }
    };

    try {
        saxParser.parse(new File("c:\\Users\\User\\GP\\Arbeit\\src\\iwasmitparser\\test.xml"),handler);
    } catch (IOException e) {

        e.printStackTrace();
    }



}

1 个答案:

答案 0 :(得分:6)

如果要对异常处理程序中验证失败的对象执行某些操作,可以从BindingResult中检索它,如下所示:

@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Response handleInvalidRequest(MethodArgumentNotValidException e) {
    CustomObject ce = (CustomObject) e.getBindingResult().getTarget();
    // do something with CustomObject
}

您还可以查看Spring JavaDoc for @ExceptionHandler注释,以查看支持的异常处理程序方法参数类型列表:

  

允许使用此注释注释的处理程序方法   拥有非常灵活的签名。他们可能有争论   以下类型,按任意顺序:

     
      
  • 异常参数:声明为一般异常或更具体的异常。这也可以作为映射提示   注释本身不会通过它缩小异常类型   值()。
  •   
  • 请求和/或响应对象(Servlet API或Portlet API)。您可以选择任何特定的请求/响应类型,例如ServletRequest /   HttpServletRequest或PortletRequest / ActionRequest / RenderRequest。   请注意,在Portlet案例中,显式声明了action / render   参数还用于将特定请求类型映射到a   处理程序方法(如果没有给出其他信息   区分动作和渲染请求。)
  •   
  • 会话对象(Servlet API或Portlet API):HttpSession或PortletSession。这种类型的参数将强制存在   相应的会话。因此,这样的论点永远不会   是空的。请注意,会话访问可能不是线程安全的   特别是在Servlet环境中:考虑切换   如果允许多个请求,则“synchronizeOnSession”标志为“true”   同时访问会话。
  •   
  • WebRequest或NativeWebRequest。允许通用请求参数访问以及请求/会话属性访问,而不允许   与本机Servlet / Portlet API绑定。
  •   
  • 当前请求区域设置的区域设置(由可用的最具体区域设置解析程序确定,即已配置的LocaleResolver   在Servlet环境中和Portlet中的门户区域设置   环境)。
  •   
  • 用于访问请求内容的InputStream / Reader。这将是Servlet / Portlet公开的原始InputStream / Reader   API。
  •   
  • OutputStream / Writer,用于生成响应的内容。这将是Servlet / Portlet公开的原始OutputStream / Writer   API。
  •