1

Dozer 的文档指出,您应该只在服务器上的应用程序中运行一个 DozerBeanMapper 实例。对于最初的开发,我忽略了这一点,现在我想更新应用程序来做到这一点。

当应用程序在 glassfish 上启动时,如何实例化 DozerBeanMapper 类,以及一旦应用程序启动或新部署后,我将如何在另一个类中访问其“map”方法?

这是针对 EJB 的,所以我不能使用任何 servlet 来执行此操作。



好的,所以我终于有时间重构这段代码了。使用来自@Mikko Maunu 的指针,我正在编辑我的问题,以便为将来可能会发现它有用的任何人提供我为我工作的代码。

package com.xyz.utilities.singleton;

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import org.dozer.DozerBeanMapper;

@Startup
@Singleton
public class DozerInstantiator {

  private DozerBeanMapper mapper = null;

  @PostConstruct
  void init() {
    mapper = new DozerBeanMapper();
  }

  public DozerBeanMapper getMapper() {
    return mapper;
  }

}

这是一个简单的用例:

将 EJB 成员变量注入您的客户端类:

  @EJB
  DozerInstantiator di;

在客户端类的某个方法中,您可以像这样调用推土机映射器:

Credentials credentials = di.getMapper().map(credentialsDTO, Credentials.class);
// or
Credentials credentials = new Credentials();
di.getMapper().map(credentialsDTO, credentials);

如果这是错误的或不正确的,请有人发表评论。在那之前,这似乎可行,所以我将使用我根据 Mikko 的意见开发的这个解决方案。

4

1 回答 1

1

如果您使用的是 GlassFish 3.x,那么您可以使用 EJB 3.1 Singleton Session Bean:

@Startup //initialization in application startup
@Singleton //only one instance 
public class DozerInitializer {
    private String status;

    @PostConstruct //executed once and only once when sole instance is created
    void init {
        //do steps needed to instantiate DozerBeanMapper
        //here
    }
}
于 2012-06-17T17:17:01.033 回答