2016-06-29 2 views
3

나는 웹 소켓에 대해 tutorial을 따라 왔으며 예제 코드의 작동 방식을 99 % 이해합니다. 1 %는 Dependency Injection을 다룹니다. DI를 연구 한 후에 클래스가 작동하려면 클래스의 객체 (에테르 자체 또는 다른 객체)에 의존하게된다는 것을 이해합니다. 사용 방법은 다음과 같습니다.Dependecy Injection Null Pointer Exception을 야기 함

package org.example.websocket; 

... 
import javax.websocket.server.ServerEndpoint; 
import javax.inject.Inject; 

@ApplicationScoped 
@ServerEndpoint("/actions") 
public class DeviceWebSocketServer { 

    @Inject 
    private DeviceSessionHandler sessionHandler; 

    @OnOpen 
    public void open(Session session) { 
    } 

    ... 
} 

나는 이론이 여기에 기능을하기 위해 클래스 "DeviceWebSocketServer" "DeviceSessionHandler"에 달려 있음을 이해합니다. 그러나이 코드를 실행하면 logcat에 java.lang.NullPointerException이 표시됩니다.

그래서 sessionHandler가 초기화되지 않아서 null이되고 놀고 예외를 던져 버리는 이유를 알았습니다. 이것을 막으려는 @Inject의 목적이 아닌가? 나는

private DeviceSessionHandler sessionHandler = new DeviceSessionHandler(); 

그러나

은 다음 tutorial처럼 행동하지 않는 응용 프로그램이 그렇게하도록 .... 변경하여 NPE을 방지 할 수 있어요
Testing the Java WebSocket Home Application
Step 4:에서 장치는 자바 웹 소켓 홈 서버에 추가 두 웹 브라우저에서 렌더링됩니다.

두 브라우저는 업데이트되지 않습니다. 이제는 DI가 작동하기 때문에, 또는 다른 요인 때문에 나는 그것을 모른다. 왜 Dependency Injection이 작동하지 않는지 알아내는 데 도움이 필요합니다. 그런 다음 다른 결과가 나타나는 원인인지 판단 할 수 있습니다.

더 많은 코드를 게시하거나 logcat 또는 도움이 될만한 것으로 생각하는 항목을 게시 할 수 있습니다. 감사합니다.

+0

화레 당신은 당신의 예를 배포? –

+0

Netbeans/Tomcat을 사용하여 로컬로 호스트하는 방법을 아직 알지 못했습니다. – chewbapoclypse

+1

@Inject는 구성원이 "주사 가능"이라는 마커 일뿐입니다. 런타임시 실제 주입을 수행하려면 DI 프레임 워크가 필요합니다. 특정 DI 프레임 워크를 사용하고 있습니까? 그렇다면 어느 것입니까? – paulk23

답변

1

당신은 @Inject가 없으면 모든 핸들러를 공유하기를 원하기 때문에 @Inject가 없으면 그 핸들러를 새로 처리하기 만하면된다. 클라이언트는 장치를 업데이트하고 다른 모든 클라이언트는이를 볼 수 있으며 테스트를 마쳤습니다.

두 번째 질문은 GlassFish를 사용하지 않기 때문에 GlassFish "javax.json"lib를 포함해야하거나 maven을 사용하여 가져 오기를 관리해야한다고 가정합니다. 대신에만 선언의, 글래스 피쉬 구현을 추가해야합니다, 그래서 당신은 추가해야합니다 :

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.json</artifactId> 
    <version>1.0.4</version> 
</dependency> 
+1

코드를 디버깅하여 근본 원인을 발견했습니다. 도움이되기를 바랍니다. – ccjli

+0

고마워 제임스 톰캣을 사용하지 않고 결국 GlassFish를 사용하여 관리 콘솔에 원격으로 로그인하려고 시도했을 때 완전히 새로운 웜을 실행할 수 있었으며 CLI 및 셸 명령을 통해서만 업데이트를 푸시 할 수있었습니다. 다시 돌아가서 이것을 확인해보십시오. – chewbapoclypse

+0

전혀 문제가되지 않으며 항상 다른 컨테이너는 API의 구현이 다르다는 것을 기억하십시오. 한 컨테이너에 lib가없는 경우 간단히 찾아서 클래스 경로에 추가하십시오. . 포스가 함께하길. – ccjli

관련 문제