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
。首先,我需要改变我的问题,其次,我在运行时查询上下文的方式似乎是错误的。