我想将日志记录添加到Servlet中,因此我创建了Filter,该过滤器应显示请求并转到Servlet。但不幸的是,我遇到了例外:
java.lang.IllegalStateException: getReader() has already been called for this request
at org.apache.catalina.connector.Request.getInputStream(Request.java:948)
at org.apache.catalina.connector.RequestFacade.getInputStream(RequestFacade.java:338)
at com.noelios.restlet.ext.servlet.ServletCall.getRequestEntityStream(ServletCall.java:190)
因此,要解决此问题,我发现了Wrapper的解决方案,但它不起作用。我还能在代码中使用/更改什么?有任何想法吗?
[MyHttpServletRequestWrapper]
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper
{
public MyHttpServletRequestWrapper(HttpServletRequest request)
{
super(request);
}
private String getBodyAsString()
{
StringBuffer buff = new StringBuffer();
buff.append(" BODY_DATA START [ ");
char[] charArr = new char[getContentLength()];
try
{
BufferedReader reader = new BufferedReader(getReader());
reader.read(charArr, 0, charArr.length);
reader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
buff.append(charArr);
buff.append(" ] BODY_DATA END ");
return buff.toString();
}
public String toString()
{
return getBodyAsString();
}
}
[MyFilter]
public class MyFilterimplements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
final HttpServletResponse httpServletResponse = (HttpServletResponse) response;
final HttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper(httpServletRequest);
final String requestBody = requestWrapper.toString();
chain.doFilter(request, response);
}
}
看起来restlet框架已经调用getRequestEntityStream()
了Request对象,而该对象又被调用getInputStream()
,因此getReader()
对请求的调用将抛出IllegalStateException
。用于getReader()和getInputStream()的Servlet
API文档说:
public java.io.BufferedReader getReader()
...
...
Throws:
java.lang.IllegalStateException - if getInputStream() method has been called on this request
public ServletInputStream getInputStream()
...
...
Throws:
java.lang.IllegalStateException - if the getReader() method has already been called for this request
从文档看来,我们不能同时对Request对象调用getReader()和getInputStream()。我建议您使用getInputStream()
而不是getReader()
包装。
我有一个Jersey Web服务,需要解析与请求一起发送的一些json数据。 此服务生成以下异常: 我做了一些研究,表明不能在同一个请求上调用和。因此,似乎已经调用了一个实例。如果我没有给它打个明确的电话,这怎么可能呢?为了解决这个问题,我使用了方法 使用这种方法,我如何使用字节的int来获取json?
我正在做关于CXF和Spring的培训,所以我写了一个非常简单的CXF演示,其中只有接口“HelloWorld”和它的实现者“HelloWorldWs”。 我想用Tomcat发布它。我编写了web.xml和applicationcontext.xml(Spring配置文件。虽然我可以发布WSDL。但是控制台列出了一个问题: 我没有使用或编写任何io函数,只是一个“sayhi”函数。我被难倒了。
代码: 我的如下所示: 在JSP中,我只是给出了一个按钮,它给出了对话框。单击该按钮后,我将获得异常。 如何避免这一点?
我得到了以下错误:java。lang.IllegalStateException:在使用Struts2实现JSON时,已为此请求调用getInputStream()。例外情况: 请帮助我解决这个错误,因为我一直在解决这个问题。我没有什么问题:我已经实现了ServletRequestAware,并使用它来获取userLocale。它是否与JSONWriter对象冲突。