我有一个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();
}
}
答案 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。