2013-07-11 5 views
1

Dozer (http://dozer.sourceforge.net/)에 대한 instatiator 빈을 만들었습니다. 하지만이 EJB를 삽입하면 nullpointer 예외가 발생합니다.Dozer Singleton Startup Null로 injotced

여기

package com.unijunction.ordercloud.common.rest; 

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
import javax.inject.Singleton; 
import javax.ejb.Startup; 

import org.dozer.DozerBeanMapper; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
@Startup 
@Singleton 
public class DozerInstantiator { 

private DozerBeanMapper mapper; 

private Logger log = LoggerFactory.getLogger(DozerInstantiator.class); 

public enum States { 
    BEFORESTARTED, STARTED, PAUSED, SHUTTINGDOWN 
}; 

private States state; 

//TODO: DozerIsntantiator is retunring null 

@PostConstruct 
public void initialize() throws Throwable { 
    log.info("---------------Dozer Starting Up-----------------"); 
    try{ 
     state = States.BEFORESTARTED; 
     this.mapper = new DozerBeanMapper(); 

    } catch (Throwable e) { 
      log.error("Cause: " + e.getCause()); 
      log.error("Message: " + e.getMessage()); 
      log.error("Class: " + e.getClass()); 
      log.error("StackTrace: " + e.getStackTrace()); 
      throw e; 
     } 

    state = States.STARTED; 
    log.info("---------------Dozer Started-----------------"); 
} 


@PreDestroy 
public void terminate() { 
    state = States.SHUTTINGDOWN; 
    // Perform termination 
    log.info("---------------Dozer Shuttingdown-----------------"); 
} 

public States getState() { 
    return this.state; 
} 

public void setState(States state) { 
    this.state = state; 
} 

public DozerBeanMapper getMapper() { 
    return this.mapper; 
} 
} 
도저

을 intialising 내 싱글 시작 콩입니다

가 주입되고있는 클래스는 제네릭 클래스이며, 다음과 같습니다

public class DtoConverter<T1, T> { 

protected final Class<T> entityClass; 

@EJB 
DozerInstantiator dozerInstantiator; 

//instance for dozer to convert beans 
protected DozerBeanMapper mapper; 

private Logger log = LoggerFactory.getLogger(DozerInstantiator.class); 

public DtoConverter(){ 
    this.entityClass = null; 
} 

/** 
* Setup the class 
* 
*/ 
public DtoConverter(Class<T> entityClass) { 
    this.entityClass = entityClass; 
    //TODO: only allow one instance of this to exist 
    //https://ordercloud.atlassian.net/browse/API-80 
    try{ 
     mapper = dozerInstantiator.getMapper(); //<--- This throws null pointer 
    }catch(Exception e){ 
     mapper = new DozerBeanMapper(); 
    } 
} 

는 널 포인터 예외가 발생합니다. Stateless bean과 Statefull bean으로 사용하려고 시도했지만 결과는 동일하게 유지됩니다.

도움을 주시면 감사하겠습니다. 이것은 JBOSS AEP 6에서 실행되는 JAVA EE입니다.

답변

1

CDI 스펙에서는 단일 유형을 일반 유형 클래스에 삽입 할 수 없습니다. 그래서 정적 final dozer 인스턴스를 게으른 초기화로 작성했습니다. 그것은 다음 제네릭 형식 클래스라고

public static DozerBeanMapper getInstance(){ 
    return MapperHolder.instance; 
} 

private static class MapperHolder{ 
    static final DozerBeanMapper instance = new DozerBeanMapper(mappingList); 
} 

:

내가 DozerInstantiator에 다음과 같은 두 가지 방법으로 추가 된 싱글은 도저 API에 포함되어

DozerInstantiator dozerInstantiator = new DozerInstantiator(); 

    try{ 
     mapper = dozerInstantiator.getInstance(); 
    }catch(Exception e){ 
     log.error("Failed to initialise singleton Dozer bean"); 
    } 
0

을 /이 방법은 일치해야합니다 필요에 따라

Mapper getMapper() { 
     return DozerBeanMapperSingletonWrapper.getInstance(); 
    } 

@ CDI로 바꾸려면 @Produce anno를 참조하십시오. 기술 사양.