2012-11-02 94 views
3

当我试图在服务器上部署我的应用程序时,我在IBM Websphere Application Server 8.5上遇到以下异常。 我在我的应用程序中使用WS 8.5,EJB 3.1,Java EE 6。注释验证异常(com.ibm.wsspi.amm.validate.ValidationException)

[11/1/12 11:06:47:208 PKT] 0000005d annotations E CWWAM0003E: An exception occurred while validating an annotation: com.ibm.wsspi.amm.validate.ValidationException: CWWAM2302E: The class com.xxx.yyy.services.UsersServiceBean is annotated with an invalid @PersistenceContext declaration; no name is specified. 
          com.ibm.wsspi.amm.validate.ValidationException: CWWAM2302E: The class com.xxx.yyy.services.UsersServiceBean is annotated with an invalid @PersistenceContext declaration; no name is specified. 
at com.ibm.ws.amm.validate.persistence.PersistenceContextValidator.validateClassAnnotation(PersistenceContextValidator.java:86) 

以下是我的Java代码。

@PersistenceContext(unitName="myUnit") 
@Stateless(name="UsersService") 
public class UsersServiceBean implements UsersService {...} 

回答

1

总之,在一个类声明@PersistenceUnit时,你必须添加一个name="...",你可以用它来查找该EntityManagerFactorynew InitialContext("java:...")。或者,您可以在班级中声明@PersistenceUnit(...) EntityManagerFactory emf;字段并省略名称。

所有参考注释与@Resource基本相同。根据公共注释规范:

name元素是资源的JNDI名称。当资源 注释应用于字段时,名称 元素的默认值是由类名称限定的字段名称。当应用于 的一个方法时,默认是JavaBeans属性名称,对应 这个方法由类名限定。在课堂上应用时, 不是默认值,必须指定名称。

的最后一句话是相关的,它是有道理的:使用@PersistenceUnit(和所有其他@Resource般的注解)有两个作用:

  1. 如果要声明一个字段或方法的注释,然后容器将在实例创建时自动注入。
  2. 使用其名称将引用插入到java:comp名称空间中。如果您在字段或方法上声明注释,则默认名称为java:comp/env/com.example.ClassName/targetName

如果您在类中声明注释,则(1)没有注入,(2)没有默认名称,因此无法绑定到java:comp/env。在这种情况下,注释声明是毫无意义的,所以这是一个错误。