我有这是越来越初始化两次单EJB。我不知道为什么,它是完全地defenting点中,据我可以告诉有一个singleton bean。任何帮助将不胜感激。正如你可以看到我试图在把一个静态布尔值,以防止多个初始化(其实不是应该要求),但它并没有区别。

豆:

@Singleton 
@Startup
public class DataModelBean implements DataModelBeanLocal {

   private static Logger log = Logger.getLogger(DataModelBean.class.getName());

   @PostConstruct
   public void init(){
      log.info(this);           
   }
}

日志输出片段:

2010-02-17 16:06:13,670 INFO  [AutoDeployer        :DataModelBean       ] com.xxx.xxx.datamodel.DataModelBean@117843d
2010-02-17 16:06:14,233 INFO  [AutoDeployer        :DataModelBean       ] com.xxx.xxx.datamodel.DataModelBean@62b9d3

时它创建2种豆!!或者是将它部署该应用两次?

顺便说我使用GlassFish的第三版,这是成熟足够?我应该使用v2或其他什么东西?想法?

有帮助吗?

解决方案

下面的单例:

@Singleton
public class MasterDataCache 
{
    private final static Logger logger = LoggerFactory.getLogger(MasterDataCache.class);

    private Map cache;

    @PostConstruct
    public void initCache() {
        logger.debug("initCache()");
        this.cache = new HashMap();
    }

    public Object get(String key){
        return this.cache.get(key);
    }

    public void store(String key,Object value){
        this.cache.put(key, value);
    }
}

和下面的servlet:

@WebServlet(name="SingletonTester", urlPatterns={"/SingletonTester"})
public class SingletonTester extends HttpServlet {

    @EJB
    MasterDataCache masterDataCache;

    @Override
    public void init(){
     masterDataCache.store("startup", new Date());
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        try {
            out.println("Startup time: " + masterDataCache.get("startup") );
        } finally {
            out.close();
        }
    }
}

封装为战争工作GFv3下“手动”展开时如预期。它还部署精细和NetBeans下预期(该initCache被调用一次只)的作品。 <击>我的唯一问题是,在部署的Eclipse下失败(GFv3抱怨不包含任何EJB模块,但是它们是在eclipseApps/$projectName eclipseApps/$projectName/WEB-INF/classses)。可悲的是,这似乎是在GlassFish Eclipse插件(至少我使用的版本)中的错误。我并不认为有很多问题,在问题追踪器虽然...奇怪,因为这看起来像一个大阻断一个。但是Eclipse之外,GFv3可以正常工作,我无法重现您的问题。

更新:我终于把东西下的Eclipse和GlassFish v3的工作。我不会把所有的细节,但问题是,我不知何故未能获得我的项目直接认定为“动态Web模块”,2.5版本最初设定在2.3,我觉得这有一些东西需要与部署错误上GFv3。后设置了我的项目正确(设置为2.5的面),部署它工作得很好。所以,我只是搞砸了自己。

其他提示

此问题发生在ejb-jar.xml中的EJB名称不等于EJB类名。 点击 例如:

<ejb-name>MySingletonBean</ejb-name>
<ejb-class>ru.rozge.MyTestSingletonBean</ejb-class>

在这种情况下,GF注册了两个豆具有不同JNDI名称( “Java的:全球/ MySingletonBean” 和 “Java:全球/ MyTestSingletonBean”)。然后在初始化它创建了两个对象,首先 - MySingletonBean和第二 - MyTestSingletonBean结果 此外,如果你使用@Resource注释注射资源,GF操作:点击 1)GF创建第一对象“MySingletonBean”,并在它正确地注入资源;结果 2)GF创建第二对象“MyTestSingletonBean”和失败上注入(注入所有资源等于null或默认值)。结果 测试在GF 3.1构建12 @Singleton @Startup组合。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top