3

アプリケーションをサーバーにデプロイしようとすると、IBM Websphere ApplicationServer8.5で次の例外が発生しました。アプリケーションでWS8.5、EJB 3.1、JavaEE6を使用しています。

[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

つまり、クラスを宣言するときは、 withを検索するために使用できる@PersistenceUnita を追加する必要があります。または、クラスでフィールドを宣言し、名前を省略できます。name="..."EntityManagerFactorynew InitialContext("java:...")@PersistenceUnit(...) EntityManagerFactory emf;

すべての ref 注釈は基本的に と同じ@Resourceです。コモンズ注釈仕様ごと:

name 要素は、リソースの JNDI 名です。Resource アノテーションがフィールドに適用される場合、name 要素のデフォルト値は、クラス名で修飾されたフィールド名です。メソッドに適用される場合、デフォルトは、クラス名で修飾されたメソッドに対応する JavaBeans プロパティ名です。クラスに適用する場合、デフォルトはなく、名前を指定する必要があります。

最後の文は関連性があり、理にかなっています: using @PersistenceUnit(および他のすべての@Resourceような注釈) には 2 つの効果があります。

  1. フィールドまたはメソッドでアノテーションを宣言すると、インスタンスの作成時にコンテナーが自動的に挿入されます。
  2. java:comp参照は、その名前を使用して名前空間に挿入されます。フィールドまたはメソッドで注釈を宣言する場合、デフォルト名はjava:comp/env/com.example.ClassName/targetName.

クラスでアノテーションを宣言すると、(1) インジェクションがなく、(2) デフォルト名がないため、 にバインドする方法がありませんjava:comp/env。その場合、アノテーション宣言は無意味になるので、エラーです。

于 2012-11-02T13:24:48.140 に答える