web-dev-qa-db-ja.com

ServletWebServerFactory Beanがないため、ServletWebServerApplicationContextを起動できません

メインアプリケーションを使用してアプリケーションを実行すると、consoleUnableでWebサーバーを起動できませんでした。ネストされた例外はorg.springframework.context.ApplicationContextExceptionです:ServletWebServerFactory Beanがないため、ServletWebServerApplicationContextを起動できません。

主な用途

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

サーブレット初期化子

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
}

build.gradle

    buildscript {
        ext {
            springBootVersion = '2.0.0.M4'
        }
        repositories {
            jcenter()
            mavenCentral()
            maven { url "https://repo.spring.io/snapshot" }
            maven { url "https://repo.spring.io/milestone" }
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
    }

    plugins {
        id "org.sonarqube" version "2.5"
    }

    apply plugin: 'Java'
    apply plugin: 'idea'
    apply plugin: 'Eclipse-wtp'
    apply plugin: 'jacoco'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'war'


    group = 'com.demo'
    version = '0.0.1-SNAPSHOT'

    // Uses JDK 8
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    repositories {
        maven { url "https://repo.spring.io/milestone" }
        jcenter()
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
    }
    configurations {
        providedRuntime
    }
    dependencies {

        // SPRING FRAMEWORK
        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.boot:spring-boot-starter-aop')
        compile('org.springframework.boot:spring-boot-starter-actuator')

        // Tomcat Server
        providedRuntime('org.springframework.boot:spring-boot-starter-Tomcat')

        //Spring Jpa
        compile('org.springframework.boot:spring-boot-starter-data-jpa')

        // SPRING SECURITY
        compile('org.springframework.boot:spring-boot-starter-security')

        // MYSQL and HIBERNATE
        compile 'mysql:mysql-connector-Java:5.1.34'
        //compile 'org.hibernate:hibernate-core:5.2.11.Final'
        //compile 'org.hibernate:hibernate-validator:5.1.3.Final'
}

助けて

10
Vinay

この回答Andres Cespedes Morales のおかげで、これが役立つかもしれません:

このメッセージは:ApplicationContextで少なくとも1つのServletWebServerFactory beanを設定する必要があるため、spring-boot-starter-Tomcatが既にある場合はそのBeanを自動設定するか、または行う必要があります手動で

そのため、テストではapplicationContextをロードする構成クラスは2つのみで、これらは= {WebsocketSourceConfiguration.class、WebSocketSourceIntegrationTests.class}であり、少なくともこれらのクラスの1つには、目的のインスタンスを返す@Beanメソッドが必要です。 ServletWebServerFactory。

  • ソリューション*

構成クラス内のすべてのBeanを必ずロードしてください

WebsocketSourceConfiguration {
  @Bean 
  ServletWebServerFactory servletWebServerFactory(){
  return new TomcatServletWebServerFactory();
  }
}

または、AutoConfigurationがそれらのBeanのクラスパススキャンおよび自動設定を実行できるようにします。

@EnableAutoConfiguration
WebsocketSourceConfiguration

Integration Testクラスでも実行できます。

@EnableAutoConfiguration
WebSocketSourceIntegrationTests

詳細については、SpringBootTestアノテーション documentation https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/context/SpringBootTestを確認してください。 .html

6
pie

私は多くのjspファイルがそのアプリケーションとデータベース接続を実行するためにデータを必要とすることで春ブートアプリケーションを作成しました書かれたJava class:

UserAuthenticationFilterは、my Java mongoDBデータベースに接続し、userIdとパスワードを取得するクラスです。

AppLoginSuccessHandlerは、ログインしているユーザーを処理するクラスです。

AppLogoutSuccessHandlerは、ログアウトするユーザーを処理するクラスです。

configure()許可とユーザーを指定しました。

public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter
    {
        @Autowired
        UserAuthenticationFilter userAuthenticationFilter; 
        //this is my Java class to get userId and pass for login site

        @Autowired
        AppLoginSuccessHandler appLoginSuccessHandler; 
        //this is my Java class handler when user login site

        @Autowired
        AppLogoutSuccessHandler appLogoutSuccessHandler;
        //this is my Java class handler when user log out site

        @Bean
        public UserAuthenticationFilter UserDetailsService(){
            return new UserAuthenticationFilter();
        }

        protected void configure(HttpSecurity http){

            try {

                http.authorizeRequests()
                            .antMatchers("/bootstrap/*").permitAll()
                            .antMatchers("/fonts/*").permitAll()
                            .antMatchers("/images/*").permitAll()
                            .antMatchers("/css/*").permitAll()
                            .antMatchers("/js/*").permitAll()
                            .antMatchers("/index.jsp").permitAll()
                            .antMatchers("/accessdenied").permitAll()
                            .antMatchers("/WEB-INF/view/*").permitAll()
                            .antMatchers("/**").access("hasAnyRole('XXX','XXX','XXX',"
                                    + "'XXX','XXX')").
                            anyRequest().authenticated()
                            .and()                              .formLogin().loginPage("/index.jsp").defaultSuccessUrl("/view/dashboardView", true).successHandler(appLoginSuccessHandler)
                            .failureUrl("/index.jsp?error=true")
                            .and()
                            .logout().logoutUrl("/j_spring_security_logout").logoutSuccessHandler(appLogoutSuccessHandler)
                            .and()
                            .exceptionHandling();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

MvcConfiguration:次のコードを記述しました。次のコードはDispatcherServletのように機能することに留意して、もう1つのクラスを記述しました。

    @SuppressWarnings("deprecation")
    @Configuration
    @EnableWebMvc
    @ComponentScan
    public class MvcConfiguration extends WebMvcConfigurerAdapter{
        public void configureViewResolver(ViewResolverRegistry registry){
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setViewClass(getClass());
            resolver.setViewNames("org.springframework.web.servlet.view.JstlView");
            resolver.setPrefix("/WEB-INF/view/");
            resolver.setSuffix(".jsp");
        }
    }

Application1はスプリングブートのメインクラスです。このクラスを実行するとエラーが発生します。

org.springframework.context.ApplicationContextException:ServletWebServerFactory Beanがないため、ServletWebServerApplicationContextを起動できません。

    @SpringBootApplication
    @ComponentScan("XXX.XXX.XXX.SpringSecurityWebAppConfig")
    public class Application1 extends SpringBootServletInitializer{

        protected SpringApplicationBuilder configurApplicationBuilder(SpringApplicationBuilder application){
            return application.sources(Application1.class);
        }
        public static void main(String[] args) {
            //SpringApplication.run(Application1.class, args);
            new Application1().configure(new SpringApplicationBuilder(Application1.class)).run(args);
        }

    }
0
pooja