本文将介绍java.lang.IllegalStateException:此请求已调用getReader的详细情况,特别是关于的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个
本文将介绍java.lang.IllegalStateException:此请求已调用getReader的详细情况,特别是关于的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于android – java.lang.IllegalStateException:递归调用getWritableDatabase、ava.lang.IllegalStateException:此响应已调用getOutputStream()、Exception in thread "Reference Handler" java.lang.IllegalMonitorStateException、HttpServletRequest.getHeader("X-Real-IP")报错java.lang.IllegalStateException的知识。
本文目录一览:- java.lang.IllegalStateException:此请求已调用getReader()(请求调用失败)
- android – java.lang.IllegalStateException:递归调用getWritableDatabase
- ava.lang.IllegalStateException:此响应已调用getOutputStream()
- Exception in thread "Reference Handler" java.lang.IllegalMonitorStateException
- HttpServletRequest.getHeader("X-Real-IP")报错java.lang.IllegalStateException
java.lang.IllegalStateException:此请求已调用getReader()(请求调用失败)
我想将日志记录添加到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); }}
答案1
小编典典看起来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()
包装。
android – java.lang.IllegalStateException:递归调用getWritableDatabase
D/AndroidRuntime(836): Shutting down VM W/dalvikvm(836): threadid=1: thread exiting with uncaught exception (group=0x4001d800) E/AndroidRuntime(836): FATAL EXCEPTION: main E/AndroidRuntime(836): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.FirstProject/com.example.FirstProject.List}: java.lang.IllegalStateException: getWritableDatabase called recursively E/AndroidRuntime(836): at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2663) E/AndroidRuntime(836): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) E/AndroidRuntime(836): at android.app.ActivityThread.access$2300(ActivityThread.java:125) E/AndroidRuntime(836): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) E/AndroidRuntime(836): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(836): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime(836): at android.app.ActivityThread.main(ActivityThread.java:4627) E/AndroidRuntime(836): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(836): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime(836): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) E/AndroidRuntime(836): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) E/AndroidRuntime(836): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(836): Caused by: java.lang.IllegalStateException: getWritableDatabase called recursively E/AndroidRuntime(836): at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:81) E/AndroidRuntime(836): at com.example.FirstProject.Database.onCreate(Database.java:36) E/AndroidRuntime(836): at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:106) E/AndroidRuntime(836): at android.database.sqlite.sqliteOpenHelper.getReadableDatabase(sqliteOpenHelper.java:158) E/AndroidRuntime(836): at com.example.FirstProject.List.onCreate(List.java:38) E/AndroidRuntime(836): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) E/AndroidRuntime(836): at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2627) E/AndroidRuntime(836): ... 11 more
码:
package com.example.FirstProject; import android.app.Activity; import android.app.ListActivity; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.sqliteDatabase; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.EditText; import android.widget.listadapter; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import android.widget.Toast; public class List extends ListActivity{ ListView stations; protected int tn; protected TextView source; protected EditText searchText; protected listadapter adapter; protected Cursor cursor; @Override public void onCreate(Bundle savedInstanceState)throws IllegalStateException { super.onCreate(savedInstanceState); setContentView(R.layout.screen2); tn = getIntent().getIntExtra("tn",0); sqliteDatabase db = (new Database(this)).getReadableDatabase(); // searchText = (EditText) findViewById (android.R.id.list); stations = (ListView) findViewById (android.R.id.list); Cursor cursor = db.rawQuery("SELECT source._id,FROM tinfo WHERE city._id = Mumbai",new String[]{}); startManagingCursor(cursor); adapter = new SimpleCursorAdapter(this,R.layout.screen2,cursor,new String[] {},new int[] {}); stations.setAdapter(adapter); } }
解决方法
这些方法有一个参数(sqliteDatabase对象),您必须使用该参数来执行数据库逻辑(因此您不能在其中调用getWritableDatabase()(或getReadableDatabase()).
ava.lang.IllegalStateException:此响应已调用getOutputStream()
String contenttype = rs.getString("contentType"); String filename = rs.getString("fileName"); response.setContentType(contenttype); response.setHeader("Content-disposition","attachment;filename=" + filename.replace(''"'', '' '')); java.io.InputStream instream = rs.getBinaryStream("fileData"); byte[] b = new byte[1000]; while (instream.read(b) > 0) { try { response.getOutputStream().write(b); } catch(Exception e) {} } try { response.getOutputStream().flush(); } catch(Exception e) {}
答案1
小编典典通常,它应该允许调用response.getOutputStream()
任意次。我认为您同时呼叫response.getOutputStream()
和response.getWriter()
。
请检查您是否正在呼叫response.getWriter()
任何地方,或者该请求是否正在写入的JSP中进行response.getWriter()
。
Exception in thread "Reference Handler" java.lang.IllegalMonitorStateException
Exception in thread "Reference Handler" java.lang.IllegalMonitorStateExceptionat java.lang.Object.notifyAll(Native Method)
at java.lang.ref.ReferenceQueue.enqueue(ReferenceQueue.java:73)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:171)
HttpServletRequest.getHeader("X-Real-IP")报错java.lang.IllegalStateException
定时任务(就一个定时任务)调一个service,service中注入了HttpServletRequest request作为参数,定时任务进入方法时,参数request为Current HttpServletRequest,request.getHeader("X-Real-IP")时就报错了,两个类似的项目,配置基本相同,另一个却没事。希望各路大神能给指点一下迷津。
异常信息:
java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131)
at org.springframework.web.context.support.WebApplicationContextUtils.currentRequestAttributes(WebApplicationContextUtils.java:271)
at org.springframework.web.context.support.WebApplicationContextUtils.access$0(WebApplicationContextUtils.java:270)
at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:286)
at org.springframework.web.context.support.WebApplicationContextUtils$RequestObjectFactory.getObject(WebApplicationContextUtils.java:1)
at org.springframework.beans.factory.support.AutowireUtils$ObjectFactoryDelegatingInvocationHandler.invoke(AutowireUtils.java:178)
.................
方法就是普通的方法:
public static String getRemoteHost(HttpServletRequest request){
if(null != request){
try {
String ip = request.getHeader("X-Real-IP");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
ip = request.getHeader("x-forwarded-for");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
ip = request.getRemoteAddr();
}
return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "127.0.0.1";
}
}else{
return "127.0.0.1";
}
}
今天关于java.lang.IllegalStateException:此请求已调用getReader和的介绍到此结束,谢谢您的阅读,有关android – java.lang.IllegalStateException:递归调用getWritableDatabase、ava.lang.IllegalStateException:此响应已调用getOutputStream()、Exception in thread "Reference Handler" java.lang.IllegalMonitorStateException、HttpServletRequest.getHeader("X-Real-IP")报错java.lang.IllegalStateException等更多相关知识的信息可以在本站进行查询。
本文标签: