Вернуть что-либо кроме нуля - PullRequest
0 голосов
/ 07 января 2019

Мой код работал до тех пор, пока я не добавил конфигурацию sslEnabled. Поскольку в качестве значения по умолчанию для sslEnabled я поставил "false", он вернет значение null.

И это ноль вызывает у меня следующее:

Вызвано: org.springframework.beans.factory.BeanNotOfRequiredTypeException: ожидается, что bean-компонент с именем 'servletContainer' имеет тип 'org.springframework.boot.web.servlet.server.ServletWebServerFactory' или действительно имеет тип. springframework.beans.factory.support.NullBean '

Я пытался return new ServletWebServerFactory();, но говорит, что не может создать экземпляр типа ServletWebServerFactory

@Configuration
public class ConnectorConfig {

@Value("${security.ssl.enabled}")
private boolean sslEnabled;

/**
 * Servlet container.
 *
 * @return the servlet web server factory
 */
@Bean
public ServletWebServerFactory servletContainer() {
    if(sslEnabled) {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }
    return null;
}
....

В основном, если флаг sslEnabled равен false, я не хочу включать SSL и хочу пропустить эту конфигурацию

1 Ответ

0 голосов
/ 07 января 2019

Возможно, самое простое - объявить класс-обертку и внедрить этот класс. Как создание следующего компонента:

public class ServletWebServerFactoryWrapper {

    private ServletWebServerFactory servletWebServerFactory;

    public ServletWebServerFactoryWrapper(ServletWebServerFactory servletWebServerFactory){
        this.servletWebServerFactory = servletWebServerFactory;
    }

    public static ServletWebServerFactoryWrapper getWrapper(ServletWebServerFactory servletWebServerFactory){
        return new ServletWebServerFactoryWrapper(servletWebServerFactory);
    }

    public ServletWebServerFactory getFactory(){
        return servletWebServerFactory;
    }
}

и вернуть его в свой код:

@Bean
public ServletWebServerFactoryWrapper servletContainer() {
    if(sslEnabled) {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return ServletWebServerFactoryWrapper.getWrapper(tomcat);
    }
    return ServletWebServerFactoryWrapper.getWrapper(null);
}

Я не знаю, можете ли вы использовать Optional<ServletWebServerFactory> (Java 8), но вы можете попробовать, это должно быть довольно эквивалентно этому. Ваш метод должен стать следующим:

@Bean
public Optional<ServletWebServerFactory> servletContainer() {
    if(sslEnabled) {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return Optional.of(tomcat);
    }
    return Optional.empty();
}

Помните, что эта последняя альтернатива работает только на Java 8 или выше.

...