我试图专门化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
我做错了吗?
谢谢!
答案 0 :(得分:1)
您引用的异常消息是由名称冲突引起的,该冲突与CDI根本没有直接关系:每个EJB都可以通过许多不同的JNDI名称进行寻址,其中一些名称(例如java:module/MyFacade
)只包括简单的类名,而不是包名。因此,在不同的包中不能有两个具有相同名称的EJB。
添加CDI和@Specializes
可能会阻止专用EJB显示在CDI容器中,但它仍然是EJB。
您可以尝试重命名派生类 - 这应该可以解决重复的名称问题,但我不确定它是否会解决您的整体问题。