3

当我尝试在服务器上部署我的应用程序时,我在 IBM Websphere Application server 8.5 上遇到了以下异常。我在我的应用程序中使用 WS 8.5、EJB 3.1、Java EE 6。

[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 {...}
4

1 回答 1

1

简而言之,在声明@PersistenceUnit一个类时,您必须添加一个name="..."可用于查找EntityManagerFactorywith 的new InitialContext("java:...")。或者,您可以@PersistenceUnit(...) EntityManagerFactory emf;在类中声明一个字段并省略名称。

所有的 ref 注释基本上与@Resource. 根据公共注释规范:

name 元素是资源的 JNDI 名称。当 Resource 注解应用于字段时,name 元素的默认值是类名限定的字段名。应用于方法时,默认值为与类名限定的方法对应的 JavaBeans 属性名。当应用于类时,没有默认值并且必须指定名称。

最后一句话是相关的,并且是有道理的:使用@PersistenceUnit(和所有其他@Resource类似的注释)有两个效果:

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

如果您在一个类上声明注释,那么 (1) 没有注入,并且 (2) 没有默认名称,因此无法绑定到java:comp/env. 在这种情况下,注释声明将毫无意义,因此这是一个错误。

于 2012-11-02T13:24:48.140 回答