@Specializes for EJB

时间:2015-06-04 10:52:22

标签: ejb cdi java-ee-6

我试图专门化EJB。我有

package com.foo.extension;    
@Specializes
@Stateless
public class MyFacade extends com.foo.core.MyFacade { }

<?php

    function own_strlen($str) {
        $count = 0;
        while(@$str[$count] != "")
            $count++;
        return $count;
    }

    function removeNonNumericalCharacters($str) {
        $result = "";

        for($count = 0; $count < own_strlen($str); $count++) {
            $character = $str[$count];
            if((string)(int)$str[$count] === $character)
                $result .= $str[$count];
        }

        return $result;

    }

    $string  = "(123) 011 - 34343678";
    echo removeNonNumericalCharacters($string);

?>

在我看来,这应该有效,因为@Specializes的含义是,CDI应该忘记核心类,而是使用专门的类。我还发现了这个错误https://issues.jboss.org/browse/WELD-1451,它表明可以专门化EJB。

但如果我尝试部署我的应用程序(我使用的是Weblogic 12.1.3),我总是得到

  

weblogic.utils.ErrorCollectionException:有1个嵌套错误:   weblogic.j2ee.dd.xml.AnnotationProcessException:重复的ejb名称   &#39; MyFacade&#39;发现:注释&#39;无状态&#39;在bean类   com.foo.core.MyFacade and annoation&#39; Stateless&#39;在bean类   com.foo.extension.MyFacade

我做错了吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您引用的异常消息是由名称冲突引起的,该冲突与CDI根本没有直接关系:每个EJB都可以通过许多不同的JNDI名称进行寻址,其中一些名称(例如java:module/MyFacade)只包括简单的类名,而不是包名。因此,在不同的包中不能有两个具有相同名称的EJB。

添加CDI和@Specializes可能会阻止专用EJB显示在CDI容器中,但它仍然是EJB。

您可以尝试重命名派生类 - 这应该可以解决重复的名称问题,但我不确定它是否会解决您的整体问题。