当前位置: 首页 > 知识库问答 >
问题:

Dozer Singleton启动Bean注入为Null

淳于星宇
2023-03-14
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 AEP6上运行的JAVA EE。

共有1个答案

鲜于念
2023-03-14

结果表明,CDI规范不允许将单例注入到泛型类型类中。所以我编写了一个静态final dozer实例的惰性初始化。

我向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");
    }
 类似资料:
  • 我正在使用Spring Framework/Data/HATEOAS,并试图添加dozer。 和以下汇编程序: 所以,-我对豆子和注射很陌生-但我想工厂的豆子是?应该?来注入映射器。但是映射器肯定是空的。我知道我做得不对,但我做错了什么?

  • 我有一个简单的spring启动应用程序,其中有一个兔子发送器和一个接收器。我想编写一些接收器测试,其中我以Junit类规则(RabbitContainerRule)运行rabbitmq docker实例,然后使用rabbitTemplate发送消息,测试验证接收器是否接收到相同的消息。但我得到了以下例外: 如果使用管理控制台在docker实例中手动创建队列(通过在断点处停止),则测试通过。 另外,

  • 在企业应用程序中,我试图使用netBeans 8.1将MessageDriven beans注入Web应用程序(到REST服务)。我在IDE中没有得到任何警告,但是,在部署时,我得到以下错误: 严重:加载应用程序时出现异常:CDI部署失败:Weld-001408:未满足类型StatisticsBean的依赖关系,其限定符@Default在注入点[BackedAnnotatedField]@Inje

  • 我有一个JAR文件,其中包含一个请求范围Bean。(一个注释为的类)。 我有另一个Web服务项目(作为WAR文件构建)。上述JAR文件位于WAR文件的文件夹中。 我试图的类到Web服务项目中的一个类中。 我正在得到一个 这两个项目都有JAR文件,WAR文件包含一个空的。我已经研究这个问题好几天了。请帮忙。 谢谢

  • 我有一个JSF的问题,CDI项目。我做了大量研究,发现在CDI中没有注释。我用对话框解决基于ajax的页面的问题。我想将变量从DataTable传递到dialog。为此,我不能使用bean,因为在请求结束后会丢弃值。有人能帮我解决吗?我不能使用,但这是一个糟糕的做法。或者只保存这一个变量到会话谁知道。你们能给我一些提示如何优雅地解决这个问题吗? 以下是错误消息:

  • 我正在开发一个遗留的JSF应用程序,我们正在慢慢地将其移植到Spring MVC。我们正在使用Spring Security来控制登录信息。在用户登录之后,JSF页面全局地实例化一个在任何地方都使用的会话作用域bean。我想更改应用程序,这样我们就可以先进入用Spring MVC开发的页面。 我尝试的一种方法是将bean转换为spring bean,并将其注入JSF,但不幸的是,这需要对bean进