Не удалось запустить приложение spring-data-geode и spring-boot-starter-webflux - PullRequest
0 голосов
/ 28 января 2020

У меня есть проект webflux, и я добавляю apache geode. В моем build.gradle у меня есть:

implementation 'org.springframework.data:spring-data-geode:2.2.4.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-webflux:2.2.4.RELEASE'

После добавления реализации spring-data-geode приложение вылетает с:

2020-01-28T16:29:51,965 INFO  [main] org.eclip.jetty.util.log.Log 169 initialized: Logging initialized @4337ms to org.eclipse.jetty.util.log.Slf4jLog
2020-01-28T16:29:52,050 WARN  [main] org.sprin.conte.suppo.AbstractApplicationContext 558 refresh: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start reactive web server; nested exception is java.lang.NoClassDefFoundError: org/eclipse/jetty/servlet/ServletHolder
2020-01-28T16:29:52,064 INFO  [main] org.sprin.boot.autoc.loggi.ConditionEvaluationReportLoggingListener 136 logMessage: 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-01-28T16:29:52,072 ERROR [main] org.sprin.boot.SpringApplication 826 reportFailure: Application run failed
org.springframework.context.ApplicationContextException: Unable to start reactive web server; nested exception is java.lang.NoClassDefFoundError: org/eclipse/jetty/servlet/ServletHolder
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.onRefresh(ReactiveWebServerApplicationContext.java:81)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544)
    at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.refresh(ReactiveWebServerApplicationContext.java:66)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)

Проблема в том, если я добавлю

spring.main.web-application-type=none или spring.main.web-application-type=reactive для моего application.properties, что мешает аннотации @ClientCacheApplication(name = "Web", locators = @Locator(host="1.2.3.4", port=10334), logLevel = "debug", subscriptionEnabled = true), и приложение не подключается к локатору геоданных, а также не запускает @EnableClusterDefinedRegions, что вызывает проблемы с определением простых областей, которые я хочу получить с сервера.

ОБНОВЛЕНИЕ Чтобы добавить spring-boot-starter-web к build.gradle и сделать тип приложения с пружинной загрузкой НЕТ, как показано ниже, чтобы устранить проблему, но .. .

SpringApplication app = new SpringApplication(Web.class);
app.setWebApplicationType(WebApplicationType.NONE);
SpringApplication.run(Web.class, args);

... но тогда преобразованию webflux не удается найти обработчик @Bean websocket:

2020-01-28T16:54:26,236 DEBUG [http-nio-8082-exec-2] org.sprin.web.servl.handl.AbstractHandlerMapping 412 getHandler: Mapped to ResourceHttpRequestHandler ["classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/"]
2020-01-28T16:54:26,246 DEBUG [http-nio-8082-exec-2] org.sprin.web.servl.resou.ResourceHttpRequestHandler 454 handleRequest: Resource not found
2020-01-28T16:54:26,246 DEBUG [http-nio-8082-exec-2] org.sprin.web.servl.FrameworkServlet 1131 logResult: Completed 404 NOT_FOUND

, и это приводит к ошибке веб-сайта:

enter image description here

В журнале консоли написано

WebSocket connection to 'ws://localhost:8082/ws/data' failed: Error during WebSocket handshake: Unexpected response code: 404

1 Ответ

0 голосов
/ 14 февраля 2020

Проблемы с регионами заключались в том, что классы, использующие регионы, определенные @EnableClusterDefinedRegions, были (a) созданы командой new вместо Spring @Autowired; и (b) в другой упаковке, не замеченной Spring Boot @ComponentScan. Как только они были исправлены, регионы были автоматически определены и обработаны с использованием аннотации @Resource.

@Resource(name = "Example") private Region<Object, Object> example

Также была дана программа main

SpringApplication app = new SpringApplication(Web.class);
app.setWebApplicationType(WebApplicationType.REACTIVE);
SpringApplication.run(Web.class, args);

Другая проблема была исправлена ​​путем получения правильных зависимостей в build.gradle и последующего аннотирования конечных точек для rSocket / webSocket с помощью:

@MessageMapping(value = "helloWorld")
public Flux<String> getFluxSocket() {
    log.traceEntry();
    log.info("In hello world");

    return Flux.just("{\"Hello\":\"World\"}");
}

или

@GetMapping(value = "/helloWorld", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> getRestSocket() {
    log.traceEntry();   
    return Flux.just("Hello World");
}

для конечных точек HTTP.

...