首页 文章

转发[关闭]后,已经为此响应调用了Spring引导错误getOutputStream()

提问于
浏览
-1

我目前正在开发一个Spring Boot应用程序 . 我为httpBasic身份验证实现了Spring Boot安全性 . 身份验证成功后,我的自定义Filter Method会被调用 .

protected void onSuccessfulAuthentication(javax.servlet.http.HttpServletRequest request,
        javax.servlet.http.HttpServletResponse response, Authentication authResult) throws IOException {
Iterator<? extends GrantedAuthority> it = authResult.getAuthorities().iterator();
        switch (it.next().getAuthority()) {
        case (MyConstants.ROLE_USER): {
            try {
                request.getRequestDispatcher("/user/data").forward(request, response);  break;
        } catch (ServletException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

所以我想将我需要的JSON数据的rquest对象转发到我的RestController endpoints . 这很有效 . 在我的控制器中,我想返回带有数据和Http状态代码的ResponseEntity .

@RequestMapping(value="/upload", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity< HttpStatus> upload(@RequestBody String uploadData){

    ResponseEntity<String> httpStatus = sendExchangeToRestApi(MediaType.APPLICATION_JSON, uploadData,
            "http://localhost:8080/upload", HttpMethod.PUT);
    return new ResponseEntity<String>("Test". HttpStatus.OK);

}

我用Postman测试了这个 . 输出正常,所以我得到状态200和我的身体输出测试 . 但我遇到以下错误:

servlet [dispatcherServlet]的Servlet.service()在路径[]的上下文中引发了异常[java.lang.IllegalStateException:getOutputStream()已经为此响应调用]具有根本原因java.lang.IllegalStateException:getOutputStream()具有已经在org.apache.catalina.connector.Response.getWriter(Response.java:582)的org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:227)的javax.servlet.ServletResponseWrapper上调用此响应.getWriter(ServletResponseWrapper.java:109)在javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109)的javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109)at org.springframework.security.web.util . OnCommittedResponseWrapper.getWriter(OnCommittedResponseWrapper.java:149)位于org.springframework.security.web.util.OnCommittedResponseWrapper.getWriter(OnCommittedResponseWrappe)的javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) r.java:149)org.apache.jache上的org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:115)org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:108) .runtime.PageContextImpl.release(PageContextImpl.java:172)org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120)org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75 )org.apache.jsp.view.login_jsp._jspService(login_jsp.java:171)at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)at javax.servlet.http.HttpServlet.service( HttpServlet.java:741)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:458)位于org.apache.jasper的org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFi)的javax.servlet.http.HttpServlet.service(HttpServlet.java:741)中的.servlet.JspServlet.service(JspServlet.java:330) lterChain.java:231)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)位于org.apache.catalina的org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)位于org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java)的org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:516)中的.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:580) :162)org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)atg.springframework.web.servlet.DispatcherServ . servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)位于org.springframework.web.servis.Datpatcher.vat上的org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)(DispatcherServlet.java:942)在org.springframework.web.servlet.Frame org.springframework上的javax.servlet.http.HttpServlet.service(HttpServlet.java:634)中的org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:890)中的workServlet.processRequest(FrameworkServlet.java:998)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)的javax.servlet.http.HttpServlet.service(HttpServlet.java:741)中的.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875)在org.apache.catalina.core.AppacheFatter . ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java: 215)在org.springframework.web.filter.OncePerRequestFi lter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org .springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)atorg.apringframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)org.apache.catalina.core.ApplicationFilterChain.doFilter( ApplicationFilterChain.java:166)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:320)在org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)在org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)在org.springframework.security .web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)在org.springframework.securi ty.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)在org.springframework.security.web.authentication.AnonymousAuthenticationFilter . org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)中的doFilter(AnonymousAuthenticationFilter.java:111)位于org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)在org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)在org.springframework.security.web在org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterIntern上的.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)的al(BasicAuthenticationFilter.java:215)org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)at org位于org.springframework.security.web.FilterChainProxy的org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)中的.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:215)位于org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java)的org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)中的$ VirtualFilterChain.doFilter(FilterChainProxy.java:334) :334)org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)org.springframework.security.web.FilterChainProxy $ VirtualFi lterChain.doFilter(FilterChainProxy.java:334)org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)在Org.springframework.security.web上的org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) .FlterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334)位于org.springframework.web.filter.OncePerRequestFilter.doFilter的org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) (OncePerRequestFilter.java:107)位于org.springframework.security.web.FilterChainProxy.d的org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:334) . 位于org.springframework的org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)的oFilterInternal(FilterChainProxy.java:215)org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)的.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java) :166)在org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)在org.apache.catalina.core . ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at atorg.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)org.apringframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter( ApplicationFilterChain.java:193)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)atg.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)org.springframework.web .filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) )在在org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMet org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:154) rics(WebMvcMetricsFilter.java:122)org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:107)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 107)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)在org.springframework.web.filter.CharacterEncodingFilter .doFilterInternal(CharacterEncodingFilter.java:200)org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org . apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)在org.apache.catalina.core.StandardContextValve.invoke(StandardCont extValve.java:96)在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)在org.apache.catalina .valves.ErrorReportValve.invoke(ErrorReportValve.java:92)在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343 )在org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)在org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)在org.apache.coyote.AbstractProtocol $ ConnectionHandler.process( AbstractProtocol.java:770)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1415)org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)at org .apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Unknown Source)

所以似乎多次调用getOutputStream()/ getWriter(),但我不知道为什么 .

1 回答

  • 1

    您应该注意的一件事是,每个微服务应该拥有自己的数据库,如果您的所有微服务共享同一个数据库,那么数据库将成为您的核心 Contract ,并且由于您永远不知道哪个更难以进行更改微服务使用什么 .

    说到RabbitMQ,我个人认为它是有史以来最好的Message-Broker . 我建议你有一个队列/微服务和一个Exchange /微服务 . 您可以轻松配置RabbitMQ,以根据路由密钥重定向队列之间的消息 .

    希望这有助于Best Regard

    Burim Hajrizaj

相关问题