2017-12-07 6 views
1

WAS 8.5.1.xで現在動作しているWAS 9.0.0.1でプロジェクトを実行しようとしています。 entitymanagerがDAOに注入されていないという問題があるようですが、これは他のすべてのリクエストでのみ発生します。したがって、em.createNamedQueryをDAOで実行すると、emがnullであるためにNullPointerExceptionがスローされています。私が上で説明したように、奇妙なことは、他のすべての要求と同じように失敗しているということです。何か案は?Websphere Application Server 9.0.0.1 - EntityManagerは他のすべてのリクエストでnullです

のpersistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="OperationsAPI" transaction-type="JTA"> 
     <jta-data-source>jdbc/operations</jta-data-source> 
     <class>com.i3.operations.entities.Operation</class> 
     <properties> 
      <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

リソースクラス:

@Path("/operations") 
@Api("Operations API") 
@Stateless 
public class OperationsService { 

    public static Logger logger = Logger.getLogger(OperationsService.class.getName()); 

    @Context 
    UriInfo uriInfo; 

    @EJB 
    private static OperationDAO operationDAO; 

    public OperationsService() { 
    operationDAO = new OperationDAO(); 
    } 

    @GET 
    @ApiOperation(value = "Gets all operations", response = Operation.class, responseContainer = "List") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response getOperationsAll() { 

    List<Operation> operations = operationDAO.getOperationsAll(); 

    return Response.ok().entity(operations).build(); 
    } 
} 

DAO:

@Stateless 
public class OperationDAO { 

    public static Logger logger = Logger.getLogger(OperationDAO.class.getName()); 


    @PersistenceContext(unitName="OperationsAPI") 
    private EntityManager em; 

    public List<Operation> getOperationsAll() { 

     logger.info("EntityManager: " + em); 
     TypedQuery<Operation> query = em.createNamedQuery("Operation.findAll", Operation.class); 
     return query.getResultList(); 

    } 
} 
+1

正確にはわかりません。しかし、私はこれを直接 'operationDAO = new OperationDAO();という新しいものにしていると思いますが、あなたは** EntityManager **のコンテナの注入をトリガーしていません。コンテナには、**引数なしのコンストラクタで静的フィールドを上書きする代わりに、** OperationDAO **を常時挿入する必要がありますか? –

+0

ああ、あなたはそこにいてはいけないのは正しいです。 – Carlos

答えて

2

あなたは一般的に両方の新しい演算子の使用を混在させたくありません同じオブジェクトrefeを設定する依存性注入(CDIなど)与えられたクラスのrences。

依存関係グラフが主に依存関係注入を使用している場合、依存関係注入(DI)はすべてのオブジェクトをインスタンス化する必要があります。さもなければ、DIが知らないオブジェクトインスタンスを作成することになり、その依存関係を注入することがわかりません。

これはおそらくあなたのケースで起こっていることです。これらのEJBインスタンスはプールされているため、一部のインスタンスが正しく初期化されてしまい、一部が正しく初期化されないことがあります。

あなたはおそらくちょうどに変更(または削除し、デフォルト)にしたい:

public OperationsService() {} 

私はフィールドに注入することは良いアイデアですわからないんだけど、私は言及しますスタティック修飾子をオペレーションDA0から削除するように薦めているエキスパートではありません。

関連する問題