Java 无法获取当前用户:没有可用的RequestContext

Java 无法获取当前用户:没有可用的RequestContext,java,s4sdk,Java,S4sdk,使用xsuaa approuter登录获取登录用户对象时出现以下异常 User currentUser = UserAccessor.getCurrentUser(); 我要在不使用GuiceFilter的情况下获取currentUser对象,若我应用GuiceFilter,那个么将得到下面的异常 任何人请建议我如何使用GuiceFilter获取UserAccessor.getCurrentUser() com.sap.cloud.sdk.cloudplatform.security.user

使用xsuaa approuter登录获取登录用户对象时出现以下异常

User currentUser = UserAccessor.getCurrentUser();
我要在不使用GuiceFilter的情况下获取currentUser对象,若我应用GuiceFilter,那个么将得到下面的异常

任何人请建议我如何使用GuiceFilter获取UserAccessor.getCurrentUser()

com.sap.cloud.sdk.cloudplatform.security.user.exception.UserAccessException: Failed to get current user: no RequestContext available. Have you correctly configured a RequestContextServletFilter or have you wrapped your logic in a RequestContextExecutor when executing background tasks that are not triggered by a request?
at com.sap.cloud.sdk.cloudplatform.security.user.AbstractUserFacade.getCurrentUserIfAuthenticated(AbstractUserFacade.java:85)
at com.sap.cloud.sdk.cloudplatform.security.user.AbstractUserFacade.getCurrentUser(AbstractUserFacade.java:135)
at com.sap.cloud.sdk.cloudplatform.security.user.UserAccessor.getCurrentUser(UserAccessor.java:122)
at com.company.HelloWorldServlet2.handleRequest(HelloWorldServlet2.java:35)
at com.company.BaseServlet.doPost(BaseServlet.java:120)
at com.company.BaseServlet.doGet(BaseServlet.java:104)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:287)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:277)
at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:182)
at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119)
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133)
at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130)
at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:44)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at com.sap.xs.java.valves.ErrorReportValve.invoke(ErrorReportValve.java:66)
at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:191)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at com.sap.xs.jdbc.datasource.valve.JDBCValve.invoke(JDBCValve.java:62)
at com.sap.xs.security.UserInfoValve.invoke(UserInfoValve.java:19)
at com.sap.xs.statistics.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:43)
at com.sap.xs.logging.catalina.RuntimeInfoValve.invoke(RuntimeInfoValve.java:40)
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:695)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1136)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:836)

从堆栈跟踪来看,似乎调用了
GuiceFilter
,而没有调用
RequestContextServletFilter
RequestContextServletFilter
初始化
RequestContext
,这是检索用户信息的先决条件


能否尝试在web.xml文件中显式声明
RequestContextServletFilter

基本上,Sander的答案已经正确(请接受他的答案)。更准确地说,您在web.xml中的定义必须如下所示(之前省略所有其他ServletFilter):


RequestContextServletFilter
com.sap.cloud.sdk.cloudplatform.servlet.RequestContextServletFilter
RequestContextServletFilter
/*
guiceFilter
com.google.inject.servlet.GuiceFilter
guiceFilter
/*
我已经用这个尝试了您的最小非工作示例,异常消失了。使用ALLOW_MOCKED_AUTH_HEADER:true环境变量返回一个空用户,这足以证明筛选器在Guice筛选器之前应用:


在my web.xml中添加
RequestContextServletFilter
后不工作在添加
新的RequestContextExecutor()后获得相同的异常。执行(…)也是。告诉我我错过了什么您能再次展示整个stacktrace以及RequestContextServletFilter现在是否出现在跟踪中吗?如果是,请您发布一个MWE,这样我们就可以重现这个问题了?您可以尝试将RequestContextServletFilter移动到web.xml中的GuiceFilter之前吗?Sander,我在,请建议我。你能提供一些关于你正在使用的SDK版本和项目原型的详细信息吗?我确实使用Philipp构建了应用程序,我很困惑。。我的应用程序应该使用登录身份验证()对吗?我需要获取loggedin用户对象和目标对象。请向我推荐好的方法…您的问题是关于RequestContext异常的。如果这种情况消失了,我建议接受这个答案,如果您在从安全应用程序中删除用户主体时遇到问题,请提出后续问题。