Java 运行时查询servlet上下文
我通过一些简化的配置在Java 运行时查询servlet上下文,java,spring-boot,servlets,Java,Spring Boot,Servlets,我通过一些简化的配置在ServletContextInitializer中动态创建servlet,并添加与该servlet相关的更多数据 @Configuration @EnableConfigurationProperties(value = ConformanceProperties.class) public class Initializer implements ServletContextInitializer { @Autowired private Confor
ServletContextInitializer
中动态创建servlet,并添加与该servlet相关的更多数据
@Configuration
@EnableConfigurationProperties(value = ConformanceProperties.class)
public class Initializer implements ServletContextInitializer {
@Autowired
private ConformanceProperties conformanceProperties;
// ...
public void onStartup(ServletContext container) throws ServletException {
for (ConformanceProperties.Capability capability : conformanceProperties.getCapabilities()) {
ProxyServlet proxy = new ProxyServlet();
ServletRegistration.Dynamic registration = container.addServlet(capability.getName(), proxy);
registration.setLoadOnStartup(1);
registration.addMapping(capability.getBase());
registration.setInitParameter("foo", "bar");
}
}
}
稍后,在服务bean中,我希望从当前servlet上下文(如果可用)获取该数据:
@Service
public class FooAdapter implements ResourceService {
public static Optional<HttpServletRequest> getCurrentHttpRequest() {
return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
.filter(ServletRequestAttributes.class::isInstance).map(ServletRequestAttributes.class::cast)
.map(ServletRequestAttributes::getRequest);
}
@Override
public Promise bar() {
// ...
HttpServletRequest request = getCurrentHttpRequest().get();
if (request != null) {
String foo = request.getServletContext().getInitParameter("foo");
}
// ...
}
}
@服务
公共类FooAdapter实现ResourceService{
公共静态可选getCurrentHttpRequest(){
返回可选的.ofNullable(RequestContextHolder.getRequestAttributes())
.filter(ServletRequestAttributes.class::isInstance).map(ServletRequestAttributes.class::cast)
.map(ServletRequestAttributes::getRequest);
}
@凌驾
公共承诺栏(){
// ...
HttpServletRequest请求=getCurrentHttpRequest().get();
if(请求!=null){
字符串foo=request.getServletContext().getInitParameter(“foo”);
}
// ...
}
}
不幸的是,在服务bean中,我总是得到应用程序上下文,而不是servlet上下文。因此
foo
是null
而不是bar
。如何直接在服务bean中获取servlet上下文而不是上层应用程序上下文?您不需要创建ServletContext
servlet容器就可以为您创建。您可以做的是在注册后将属性添加到ServletMapping
aftger,然后您可以访问它。@M.Deinum您是对的!我昨天调试了addServlet
。首先,我需要改变我的问题,其次,我在运行时查询上下文的方式似乎是错误的。