0

Glassfish v4 では、この非常に単純なアプリケーションでjavax.persistence.PersistenceException: No Persistence provider for EntityManager named local、URL にアクセスすると次のエラーが発生します。localhost:8080/demo/main

Glassfish v4 には組み込みプロバイダーが付属していると思われます。

以下は、war ファイルのレイアウトです。

$ jar tvf /usr/local/glassfish4/glassfish/domains/domain1/autodeploy/demo.war
    39 Sun Aug 04 17:12:40 HST 2013 META-INF/MANIFEST.MF
     0 Mon Aug 05 16:32:16 HST 2013 META-INF/
   217 Mon Aug 05 16:18:22 HST 2013 META-INF/persistence.xml
     0 Sun Aug 04 17:12:36 HST 2013 WEB-INF/
     0 Mon Aug 05 14:30:06 HST 2013 WEB-INF/classes/
     0 Mon Aug 05 14:45:26 HST 2013 WEB-INF/classes/com/
     0 Mon Aug 05 14:45:26 HST 2013 WEB-INF/classes/com/example/
     0 Mon Aug 05 16:23:28 HST 2013 WEB-INF/classes/com/example/demo/
   236 Mon Aug 05 16:24:26 HST 2013 WEB-INF/classes/com/example/demo/Foo.java
   400 Mon Aug 05 16:25:34 HST 2013 WEB-INF/classes/com/example/demo/Main.java
   168 Mon Aug 05 16:21:04 HST 2013 WEB-INF/classes/com/example/demo/RestApp.java
   564 Mon Aug 05 16:28:10 HST 2013 WEB-INF/classes/com/example/demo/Foo.class
  1006 Mon Aug 05 16:28:10 HST 2013 WEB-INF/classes/com/example/demo/Main.class
   381 Mon Aug 05 16:28:10 HST 2013 WEB-INF/classes/com/example/demo/RestApp.class
   217 Mon Aug 05 16:18:22 HST 2013 WEB-INF/classes/persistence.xml
   284 Sun Aug 04 17:12:40 HST 2013 WEB-INF/glassfish-web.xml
     0 Sun Aug 04 17:12:36 HST 2013 WEB-INF/lib/

更新:: persistence.xml_

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="local">
        <jta-data-source>jdbc/local</jta-data-source>
    </persistence-unit>
</persistence>

Main.javaオブジェクトの作成と永続化を試みます:

package com.example.demo;

import javax.persistence.Persistence;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("main")
public class Main {
  @GET
  @Produces("application/json")
  public String main () {
    Foo foo = new Foo();
    foo.setN(7);
    Persistence.createEntityManagerFactory("local").createEntityManager().persist(foo);
    return "main";
  }
}

Foo.java自明なエンティティです:

package com.example.demo;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Foo {

  private int n;

  @Id
  public int getN () {
    return n;
  }

  public void setN (int n) {
    this.n = n;
  }

}

RestApp.java自明であり、JAX-RS を正常にトリガーします。

package com.example.demo;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
public class RestApp extends Application {
}

Glassfish コントロール パネルには、ローカルの MySQL 5.6.13 インストールに正常に ping を実行するlocalというJDBC接続プールがあります。jdbc/localで呼び出される JDBC リソースがありますPool Name: local

これを修正するにはどうすればよいですか?ありがとう!

編集:persistence.xml上に追加

4

1 に答える 1

1

2 つの persistence.xml が両方とも間違った場所にあります:

META-INF/persistence.xml
WEB-INF/classes/persistence.xml

war パッケージのルートに対する正しい場所は次のとおりです。

WEB-INF/classes/META-INF/persistence.xml

曖昧さを避けるため、複数の persistence.xml を配置しないでください。

また、maven を使用する場合は、persistence.xml を src/main/resources に配置して、war の正しい場所にアセンブルする必要があります。

于 2013-08-06T06:55:19.477 に答える