2013-07-11 33 views
1

我爲推土機創建了一個instatiator bean(http://dozer.sourceforge.net/)。但是當我注入這個EJB時,它會拋出空指針異常。Dozer Singleton啓動Bean注入爲空

這是我的單身啓動Bean的intialising推土機

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; 
} 
} 

它被注入類是一個通用類,看起來像這樣:

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(); 
    } 
} 

它拋出一個空指針異常。我曾嘗試將它用作無狀態和有狀態bean,但結果保持不變。

任何幫助,將不勝感激。這是在JBOSS AEP 6上運行的JAVA EE。

回答

1

事實證明,CDI規範不允許將單例注入泛型類型類。所以我寫了一個惰性的最終推土機實例的初始化。

我加入以下兩種方法的DozerInstantiator:

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

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

據當時稱爲在通用類型的類:

DozerInstantiator dozerInstantiator = new DozerInstantiator(); 

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

一個單包含推土機API內/該方法應該匹配您的需求

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

如果您想將其轉換爲CDI,請參閱@Produce anno規格。