1

Dozer 用の instatiator Bean を作成しました ( http://dozer.sourceforge.net/ )。しかし、この EJB を注入すると、nullpointer 例外がスローされます。

これは、Dozer を初期化するためのシングルトン スタートアップ Bean です。

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

null ポインター例外をスローします。Stateless および Statefull Bean として使用してみましたが、結果は同じままです。

どんな助けでも大歓迎です。これは JBOSS AEP 6 で動作する Java EE です。

4

2 に答える 2

1

CDI 仕様では、シングルトンをジェネリック型クラスに注入することは許可されていません。そこで、静的な最終ドーザー インスタンスの遅延初期化を作成しました。

DozerInstantiator に次の 2 つのメソッドを追加しました。

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");
    }
于 2013-11-08T09:40:14.730 に答える
0

シングルトンは Dozer API に含まれています / このメソッドはニーズに一致する必要があります

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

CDI にしたい場合は @Produce アノテーションの仕様を参照してください。

于 2014-01-07T08:46:18.493 に答える