WebHU - Programozási kérdések és válaszok

Hogyan lehet letiltani az automatikus konfigurálást az aláhúzásnál

Van egy normál spring-boot webalkalmazásom a spring-boot-starter-web használatával, azaz egy beágyazott tomcat.

Most az egyik tesztelésre használt programkönyvtárhoz tartozik az undertow függőségként (mert maga is elindít egy beágyazott webszervert, hogy kigúnyolja a külső függőséget), és úgy tűnik, hogy ez arra készteti a rugós rendszerindítási automatikus konfigurációt, hogy megpróbálja konfigurálni az undertow-t. beágyazott webszerver (amely a verziók közötti eltérések miatt megszakadni látszik, és szintén nem az, amit szeretnék – nekem a tomcat a szerverem).

Itt található: tesztosztályunk:

package org.zalando.nakadiproducer.tests;

[... imports skipped ...]

import static io.restassured.RestAssured.given;

@RunWith(SpringRunner.class)
@SpringBootTest(
        // This line looks like that by intention: We want to test that the MockNakadiPublishingClient will be picked up
        // by our starter *even if* it has been defined *after* the application itself. This has been a problem until
        // this commit.
        classes = { Application.class, MockNakadiConfig.class  },
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
)
//@EnableAutoConfiguration(exclude=EmbeddedWebServerFactoryCustomizerAutoConfiguration.class)
public class ApplicationIT {
    @LocalManagementPort
    private int localManagementPort;

    @ClassRule
    public static final EnvironmentVariables environmentVariables
            = new EnvironmentVariables();

    @BeforeClass
    public static void fakeCredentialsDir() {
        environmentVariables.set("CREDENTIALS_DIR", new File("src/main/test/tokens").getAbsolutePath());
    }

    @Test
    public void shouldSuccessfullyStartAndSnapshotCanBeTriggered() {
        given().baseUri("http://localhost:" + localManagementPort).contentType("application/json")
        .when().post("/actuator/snapshot-event-creation/eventtype")
        .then().statusCode(204);
    }
}

A fő alkalmazásosztály:

package org.zalando.nakadiproducer.tests;

[imports skipped]

@EnableAutoConfiguration
@EnableNakadiProducer
public class Application {

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

    @Bean
    @Primary
    public DataSource dataSource() throws IOException {
        return embeddedPostgres().getPostgresDatabase();
    }

    @Bean
    public EmbeddedPostgres embeddedPostgres() throws IOException {
        return EmbeddedPostgres.start();
    }

    @Bean
    public SnapshotEventGenerator snapshotEventGenerator() {
        return new SimpleSnapshotEventGenerator("eventtype", (withIdGreaterThan, filter) -> {
            if (withIdGreaterThan == null) {
                return Collections.singletonList(new Snapshot("1", "foo", filter));
            } else if (withIdGreaterThan.equals("1")) {
                return Collections.singletonList(new Snapshot("2", "foo", filter));
            } else {
                return new ArrayList<>();
            }
        });

        // Todo: Test that some events arrive at a local nakadi mock
    }
}

Ez a hibaüzenet:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'undertowWebServerFactoryCustomizer' defined in class path resource [org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration$UndertowWebServerFactoryCustomizerConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.boot.autoconfigure.web.embedded.UndertowWebServerFactoryCustomizer] from ClassLoader [sun.misc.Launcher$AppClassLoader@378fd1ac]

Az említett definíciós osztály a spring-boot-autoconfigure 2.0.3.RELEASE verzióban található, és így néz ki:

@Configuration
@EnableConfigurationProperties(ServerProperties.class)
public class EmbeddedWebServerFactoryCustomizerAutoConfiguration {

    @ConditionalOnClass({ Tomcat.class, UpgradeProtocol.class })
    public static class TomcatWebServerFactoryCustomizerConfiguration {

 // tomcat, jetty

    /**
     * Nested configuration if Undertow is being used.
     */
    @Configuration
    @ConditionalOnClass({ Undertow.class, SslClientAuthMode.class })
    public static class UndertowWebServerFactoryCustomizerConfiguration {

        @Bean
        public UndertowWebServerFactoryCustomizer undertowWebServerFactoryCustomizer(
                Environment environment, ServerProperties serverProperties) {
            return new UndertowWebServerFactoryCustomizer(environment, serverProperties);
        }
    }
}

Hogyan tudom megmondani, hogy a Spring-boot ne állítsa be az Undertow-t?

Kipróbáltam az @EnableAutoConfiguration(exclude=EmbeddedWebServerFactoryCustomizerAutoConfiguration.class)-et a tesztosztályomon (a @SpringBootTest mellett), de ennek nincs hatása.

Ha megpróbálom a @EnableAutoConfiguration(exclude=EmbeddedWebServerFactoryCustomizerAutoConfiguration.UndertowWebServerFactoryCustomizerConfiguration.class)-t, ezt a hibát kapom:

Caused by: java.lang.IllegalStateException: The following classes could not be excluded because they are not auto-configuration classes:
    - org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration$UndertowWebServerFactoryCustomizerConfiguration
17.12.2018

  • meg tudnád adni a függőségeket, amelyek undertown-t használnak? 17.12.2018
  • Ez a nakadi-mock, a könyvtár, amelyen éppen dolgozom. Megváltoztathatnám, de ez a könyvtár teljes koncepciójának megváltoztatását jelentené, amit el szeretnék kerülni. 17.12.2018

Válaszok:


1

Az Undertow eltávolítása a projekt függőségei közül a legbiztonságosabb módja. A Spring Boot az osztályútvonal-ellenőrzésen alapul, így amint az Undertow elhagyja az osztályútvonalat, az automatikus konfiguráció nem kerül feldolgozásra.

A EmbeddedWebServerFactoryCustomizerAutoConfiguration problémája az, hogy nem biztosít tulajdonságkapcsolót. Pusztán a servlet konténerosztály jelenlétén alapul. Ahhoz, hogy megszabaduljon tőle, ki kell zárnia a teljes EmbeddedWebServerFactoryCustomizerAutoConfiguration:

@EnableAutoConfiguration(exclude=EmbeddedWebServerFactoryCustomizerAutoConfiguration.class)
public MyTest {

}

és a tesztkonfigurációban csak a Tomcat indításához szükséges beaneket határozza meg:

@TestConfiguraton
@EnableConfigurationProperties(ServerProperties.class)
public MyTestConfig {

  @Bean
  public TomcatWebServerFactoryCustomizer tomcatWebServerFactoryCustomizer(Environment environment, ServerProperties serverProperties) {
    return new TomcatWebServerFactoryCustomizer(environment, serverProperties);
  }

}
17.12.2018
  • A függőségekből való eltávolítása nem lehetséges, mivel ténylegesen használják (csak nem tavaszi rendszerindításon keresztül, és nem fő szerverként). Azt hiszem, megpróbáltam kizárni a teljes AutoConfiguration osztályt, de hatás nélkül – valószínűleg azért, mert a @SpringBootTest tartalmaz egy alkalmazásosztályt? Holnap újra megpróbálom. 18.12.2018
  • Tehát úgy tűnik, hogy egy @EnableAutoConfiguration(exclude=EmbeddedWebServerFactoryCustomizerAutoConfiguration.class) hozzáadása a tesztosztályomhoz nincs hatással, de a kizárás hozzáadása a fő osztályhoz működik. (Furcsa módon úgy tűnik, egyáltalán nem kell hozzáadnom a tomcababot, nem tudom, miért.) 18.12.2018
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..