2014-09-11 9 views
16

안녕하세요 제이보스 8.1로 내 봄 부팅 응용 프로그램을 배포해야하고 나는 다음과 같은 예외가 받고 있어요 : java.lang.RuntimeException가 :에 의한봄 부팅 WebSocket을은 제이보스에

을 java.lang.ClassCastException가를 : org.apache.tomcat.websocket.server.WsServerContainer는 org.wildfly의 io.undertow.servlet.core.DeploymentManagerImpl.deploy (DeployManagerImpl.java:219) 에서 io.undertow.websockets.jsr.ServerWebSocketContainer 으로 캐스팅 할 수 없습니다. extension.undertow.deployment.UndertowDeploymentService.startContext (UndertowDeploymentService.java:87) at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start (UndertowDeploymentService.java:72) at org.jboss.msc.service.ServiceControllerImpl $ StartTask.startService (ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar : 1.2.2.Final] at org.jboss.msc.service .ServiceControllerImpl $ StartTask.run (ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar : 1.2.2.Final] ... 3 자세한 내용 발생 원인 : java.lang.ClassCastException : org. apache.tomcat.websocket.server.WsServerContainer를 io.undertow.websockets.jsr.ServerWebSocketContainer (io.undertow.websockets.jsr.Bootstrap)으로 캐스팅 할 수 없습니다. $ WebSocketListener.contextInitialized (Bootstrap.java:69) at io.undertow. servlet.core.ApplicationListeners.contextInitialized (ApplicationListeners.java:173) at io.undertow.servlet.core.DeploymentManagerImpl.deploy (DeploymentManagerImpl.java:190) ... 7 더

웹 소켓 및 메시징에 대한 설정이 문제의 원인 일 수 있습니까? 나는 이것을 보았습니다 https://github.com/joshlong/boot-examples/issues/2 그리고 제안 된 해결책 중 어느 것도 나를 위해 효과가없는 것 같습니다. 다음은 내 pom의 종속성입니다.

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.1.6.RELEASE</version> 
</parent> 

<dependencies> 

    <!--Testing--> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>${apache.httpcomponents.version}</version> 
    </dependency> 

    <!-- Spring --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-websocket</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-messaging</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.thymeleaf</groupId> 
     <artifactId>thymeleaf-spring4</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
    </dependency> 

    <!--Database--> 
    <dependency> 
     <groupId>org.hsqldb</groupId> 
     <artifactId>hsqldb</artifactId> 
     <version>2.3.1</version> 
    </dependency> 
    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.1-901.jdbc4</version> 
    </dependency> 
</dependencies> 

직접 spring-boot-starter-websocket을 사용했지만 동일한 결과를 얻으려고했습니다. 이를 읽어 주셔서

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer{ 

@Override 
public void configureMessageBroker(MessageBrokerRegistry registry) { 
    super.configureMessageBroker(registry); 
    registry.enableSimpleBroker("/ssp"); 
    registry.setApplicationDestinationPrefixes("/inc"); 
} 

@Override 
public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/update/applications"); 
} 
} 

감사 : 여기 너무 내 웹 소켓의 설정입니다. 어떤 도움이라 더 많이 감사 할 것입니다. 또한 첫 번째 부팅 응용 프로그램입니다. :/

+0

나는 또한 같은 문제 동안 직면했다 gradle을 사용하여 전쟁을 건설합니다. 나는'compile' 대신'spring-boot-starter-tomcat'에'providedCompile'을 사용하여 문제를 해결할 수있었습니다. –

답변

3

잘 모르겠지만, WebSocket을 주위에 당신의 POM은 다음과 같이해야합니다 :

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-websocket</artifactId> 
</dependency> 

<dependency> 
    <groupId>org.apache.tomcat.embed</groupId> 
    <artifactId>tomcat-embed-websocket</artifactId> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-tomcat</artifactId> 
    <scope>provided</scope> 
</dependency> 

spring-messagingspring-websocketjackson-databind, spring-boot-starter-web 중복입니다.

spring-boot-starter-thymeleaf도 있습니다.

그러나 근본 원인이 tomcat-embed-websocket 인 것 같습니다. 기본적으로

+0

답장을 보내 주셔서 감사합니다. 중복 된 deps를 제거하고 tomcat-embed-websocket을 추가하기 위해 pom을 변경했지만 위의 예외는 여전히 발생합니다. 컨테이너가 undertow 웹 소켓 구현을 기대하고 있습니까? 부팅시 전체 컨테이너를 제어해야하는 이유는 무엇입니까? –

+0

물론 아니오. Spring은 JTA와 비슷한 대상 컨테이너 구현에 위임한다. Tomcat jar에 대한 앱의 클래스 경로 (WEB-INF/lib?)를 확인하고 어떤 개발자도 제외되어야하는지 확인해야합니다. –

+0

미술, 정말 고마워! Intellij가 내 라이브러리를 동기화하지 않았습니다. Noob 실수로 내 부분. 그러나 스프링 메신저를 다시 추가해야했습니다. 내 컨트롤러에서 MessageMapping 주석을 직접 작성해야한다고 생각합니다. 하지만 어쨌든, 나는 이제 좋다. 다시 한 번 감사드립니다! –

6

스프링 부팅 스타터 웹 및 스프링 부팅 스타터 웹 소켓이 있는지 확인 스프링 부팅 스타터 둥 그렇게

 <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <version>${spring-boot.version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-websocket</artifactId> 
     <version>${spring-boot.version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

하고 물러 포함 아래처럼 바람둥이를 제외 포함 바람둥이는 클래스 패스의 어디에 존재하지 않습니다.

mvn dependency:tree -Dincludes=org.springframework.boot:spring-boot-starter-tomcat 

이 명령에 의해 나열된 모든 의존성에서 톰캣 선발 제외 :

31

당신은 바람둥이 - 포함 - 웹 소켓

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.apache.tomcat.embed</groupId> 
       <artifactId>tomcat-embed-websocket</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
+1

내게는 효과가 없다. –

1

spring-boot-starter-tomcat 포함 모든 종속성을 찾으려면 다음 명령을 사용하여 제외해야합니다.

그 후, 당신은 제공된 종속성으로 javax.servlet-api를 추가 할 필요가 있습니다

<dependency> 
    <artifactId>javax.servlet</artifactId> 
    <groupId>javax.servlet-api</groupId> 
    <scope>provided</scope> 
</dependency> 
Gradle을이 문제와 사용자

:이 티켓에 대한 코멘트를 체크 아웃이 : https://github.com/spring-projects/spring-boot/issues/6166