我正在使用Tomcat和Spring WebMVC编写一个REST应用程序。
我想使用HTTP状态代码和一些XML有效负载向我的客户端发送错误信号,XML有效负载包含有关错误的更多信息。
为了捕获所有错误,无论它们发生在哪里,我编写了一个过滤器,它包装响应并覆盖sendError()方法:
private static final class GenericErrorResponseWrapper
extends HttpServletResponseWrapper
{
@Override
public void sendError(int sc, String msg) throws IOException {
final HttpServletResponse wrappedResponse = (HttpServletResponse) getResponse();
wrappedResponse.setStatus(sc, msg);
wrappedResponse.setContentType("application/xml");
PrintWriter writer = wrappedResponse.getWriter();
try {
SimpleXmlWriter xmlWriter = SimpleXmlWriterWrapper.newInstance(writer);
xmlWriter.writeStartElement("ns2", "genericError")
.writeAttribute("xmlns:ns2", "http://mynamespace")
.writeCharacters(msg)
.writeEndDocument().flush();
writer.flush();
wrappedResponse.flushBuffer();
} finally {
writer.close();
}
}
}
这种实现有两个问题:
由于Tomcat (sc,msg) is deprecated.
我如何实现我的过滤器,这样它才能做正确的事情,并且不会出现弃用警告?在Javadoc中命名的两个替代方案对我来说都不可用:
发布于 2013-11-22 22:31:36
不幸的是,没有办法避免不推荐使用的警告。正如您已经提到的,API文档中提到的两个替代方案并不涵盖相同的功能。当然,您可以使用@SuppressWarnings("deprecation")
注释您的方法,以表明使用弃用的方法是有意的。
另一件事是,即使提供了消息字符串,Tomcat也不使用消息字符串,这是一个配置问题。出于某种奇怪的原因,Tomcat将默认忽略所提供的消息字符串,并使用基于传递的返回代码的默认错误消息。您必须将系统属性org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER
设置为true
,以强制Tomcat使用您提供的错误消息。有关这方面的更多详细信息,请参阅Tomcat documentation。
发布于 2013-11-25 19:51:54
作为另一种选择-您可以先编写XML有效负载,而不调用flush/flushBuffer,然后再执行sendError(int, String)
,这将刷新缓冲区。
https://stackoverflow.com/questions/20140376
复制相似问题