首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java Servlet API -如何在不提交响应的情况下设置响应状态和原因短语

Java Servlet API -如何在不提交响应的情况下设置响应状态和原因短语
EN

Stack Overflow用户
提问于 2013-11-22 16:38:40
回答 2查看 2.7K关注 0票数 1

我正在使用Tomcat和Spring WebMVC编写一个REST应用程序。

我想使用HTTP状态代码和一些XML有效负载向我的客户端发送错误信号,XML有效负载包含有关错误的更多信息。

为了捕获所有错误,无论它们发生在哪里,我编写了一个过滤器,它包装响应并覆盖sendError()方法:

代码语言:javascript
复制
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.

  • The
  1. 生成的HttpServletResponse.setStatus响应头不正确,它在Eclipse中生成了一个弃用警告,所以它以第一行“HTTP /1.1500OK”开始。500是正确的,但原因短语应该是“内部服务器错误”,而不是“确定”。

我如何实现我的过滤器,这样它才能做正确的事情,并且不会出现弃用警告?在Javadoc中命名的两个替代方案对我来说都不可用:

  • sendError(sc,msg)是不可用的,因为它提交了响应体,并且我不能使用错误代码编写任何more
  • setStatus(sc)理论上是可用的,但它还会在响应头的第一行创建硬编码的"OK“字符串。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-22 22:31:36

不幸的是,没有办法避免不推荐使用的警告。正如您已经提到的,API文档中提到的两个替代方案并不涵盖相同的功能。当然,您可以使用@SuppressWarnings("deprecation")注释您的方法,以表明使用弃用的方法是有意的。

另一件事是,即使提供了消息字符串,Tomcat也不使用消息字符串,这是一个配置问题。出于某种奇怪的原因,Tomcat将默认忽略所提供的消息字符串,并使用基于传递的返回代码的默认错误消息。您必须将系统属性org.apache.coyote.USE_CUSTOM_STATUS_MSG_IN_HEADER设置为true,以强制Tomcat使用您提供的错误消息。有关这方面的更多详细信息,请参阅Tomcat documentation

票数 4
EN

Stack Overflow用户

发布于 2013-11-25 19:51:54

作为另一种选择-您可以先编写XML有效负载,而不调用flush/flushBuffer,然后再执行sendError(int, String),这将刷新缓冲区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20140376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档