【问题标题】:Dozer with EJB 3.1 in TomEE在 TomEE 中使用 EJB 3.1 的推土机
【发布时间】:2019-08-09 14:38:10
【问题描述】:

我在 TomEE 中使用 EJB 3.1,我想使用映射器,所以我选择了 DOZER。 这是实现:

@Startup
@Singleton
public class DozerInstantiator {
private Logger log = Logger.getLogger(DozerInstantiator.class);

public enum States {BEFORESTARTED, STARTED, PAUSED, SHUTTINGDOWN};
private States state;
private DozerBeanMapper mapper;

  @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;
            }
        log.info("---------------Dozer  Started-----------------");   }

  public DozerBeanMapper getMapper() {
    return mapper;   }

}

这是我要注入 Dozer 的 EJB:

@Stateless(name = "randomName")
@WebService(targetNamespace = "urn:x1:x2")
@Local
@TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRES_NEW)
public class RandomEJBImpl  implements RandomEJB {

@EJB
DozerInstantiator di;

        public ListOutput getAllConf() throws ServiceException {
            try {
                // code         
                objMapped = di.getMapper().map(obj, X.class);
                // more code
                }
                return listOutput 
            } catch (Exception e) {
                logger.error("Failed in RandomEJBImpl.getAllConf: "+e); 
                return null;
            }
        } 
 }

我有两个问题:

1- 如果我尝试使用之前的 DozerInstantiator 配置启动服务器,应用程序会崩溃,如您在此处看到的,直到我意识到如果我删除 @PostConstruct 它将启动;你能解释一下这是为什么吗?

INFO  09-08 14:57:17,032 [main]: (DozerInstantiator.java:initialize:35)  ----------------Dozer  Starting Up-----------------
ERROR 09-08 14:57:17,093 [main]: (DozerInstantiator.java:initialize:41)  -Cause: java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
ERROR 09-08 14:57:17,094 [main]: (DozerInstantiator.java:initialize:42)  -Message: org/apache/commons/lang3/StringUtils
ERROR 09-08 14:57:17,095 [main]: (DozerInstantiator.java:initialize:43)  -Class: class java.lang.NoClassDefFoundError
ERROR 09-08 14:57:17,095 [main]: (DozerInstantiator.java:initialize:44)  -StackTrace: [Ljava.lang.StackTraceElement;@7856e1fc

2- 所以在从 DozerInstantiator 中删除 @PostConstruct 之后 我在日志文件中有以下错误...如何避免它?

ERROR 09-08 14:34:12,948 [http-8080-2]: (RandomEJBImpl.getAllConf:830)  -Failed in Failed in RandomEJBImpl.getAllConf: java.lang.NullPointerException

【问题讨论】:

  • 因为你已经删除了@PostConstuctinit() 永远不会被调用,所以getMapper() 返回null
  • 感谢您的评论,我试图捕捉@PostConstuct 部分的异常,并用更多日志更新了问题1...您能帮忙吗?
  • 您的应用类路径中似乎没有 apache-commons 3 库。

标签: java ejb ejb-3.1 dozer


【解决方案1】:

也许尝试在 conf/system.properties 中设置以下行:openejb.classloader.forced-load=org.apache.commons.lang3 以使 lang3 能够从 webapp 加载,并且不让 tomee 跳过 webapp 以使用容器lang3版本

【讨论】:

    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多