无法解决持久性单元错误 - Netbeans 7.3 / 7.4和Glassfish 4 [英] Could not resolve a persistence unit error - Netbeans 7.3/7.4 and Glassfish 4

查看:269
本文介绍了无法解决持久性单元错误 - Netbeans 7.3 / 7.4和Glassfish 4的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在调整JSF2.0完整参考教材(虚拟教练应用程序)中的代码示例以使用CDI运行。一切都很顺利,直到我开始添加一些JSF代码,此时部署开始反复失败,说明它无法解析持久性单元。我有些困惑,因为我没有触及我的任何实体代码或控制器bean,但无论如何都将应用程序还原(手动 - 我没有将它附加到Subversion的时间)。尽管如此,错误仍然存​​在,所以一些东西发生了变化,但我找不到它!其他人报告了与错误放置的persistence.xml文件相关的相同错误,但据我所知,我的副本似乎正确部署。



该项目基于在Maven Java EE Web Archetype上,我正在使用Netbeans 7.4(final),Java EE7和Glassfish 4.还值得注意的是,当我开始编写一些JSF页面时,Netbeans似乎开发出了打嗝,因为它无法识别的标签(例如),所以我怀疑有一个错误。



如果有人有任何想法,我会很感激!



Stacktrace如下所示:

  SEVERE:调用类org.glassfish.persistence.jpa.JPADeployer时出现异常准备方法
SEVERE:java.lang.RuntimeException:无法解析与调用的模块范围内的persistence-context-ref-name [com.sun.ejb.containers.TimerBean / em]对应的持久单元[师]。请验证您的申请。
at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:727)
at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:715)
at org.glassfish.web.deployment.descriptor.WebBundleDescriptorImpl.findReferencedPUs(WebBundleDescriptorImpl.java:996)
at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:186)
at org .glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:168)
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:922)
at com.sun .enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:431)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
at org.glassfish .deployment.admin.DeployCommand.execute(DeployCommand.java:491)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ 2 $ 1.run(CommandRunnerIm pl.java:527)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ 2 $ 1.run(CommandRunnerImpl.java:523)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ 2.execute(CommandRunnerImpl.java:522)
在com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access $ 1500(CommandRunnerImpl.java:108)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ ExecutionContext.execute(CommandRunnerImpl.java:1762)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ ExecutionContext.execute(CommandRunnerImpl.java:1674)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534 )
在com.sun.enterprise.v3.admin.AdminAdapter.onMissing Resource(AdminAdapter.java:224)
at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
at com.sun.enterprise.v3.services.impl。 ContainerMapper.service(ContainerMapper.java:246)
位于org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
位于org.glassfish.grizzly.http.server。 HttpHandler.doHandle(HttpHandler.java:168)
在org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
在org.glassfish.grizzly.filterchain.ExecutorResolver $ 9 .execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain .java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.pro (org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport。))中的
。 java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy $ WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:544)
在java.lang.Thread.run(Thread.java:724)
SEVERE:准备应用程序时出现异常
SEVERE:Exce生命周期处理期间的处理
java.lang.RuntimeException:无法解析与调用的模块范围内的persistence-context-ref-name [com.sun.ejb.containers.TimerBean / em]对应的持久单元[师]。请验证您的申请。
at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:727)
at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:715)
at org.glassfish.web.deployment.descriptor.WebBundleDescriptorImpl.findReferencedPUs(WebBundleDescriptorImpl.java:996)
at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:186)
at org .glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:168)
at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:922)
at com.sun .enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:431)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
at org.glassfish .deployment.admin.DeployCommand.execute(DeployCommand.java:491)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ 2 $ 1.run(CommandRunnerIm pl.java:527)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ 2 $ 1.run(CommandRunnerImpl.java:523)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:356)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ 2.execute(CommandRunnerImpl.java:522)
在com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access $ 1500(CommandRunnerImpl.java:108)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ ExecutionContext.execute(CommandRunnerImpl.java:1762)
at com.sun.enterprise.v3.admin.CommandRunnerImpl $ ExecutionContext.execute(CommandRunnerImpl.java:1674)
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534 )
在com.sun.enterprise.v3.admin.AdminAdapter.onMissing Resource(AdminAdapter.java:224)
at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
at com.sun.enterprise.v3.services.impl。 ContainerMapper.service(ContainerMapper.java:246)
位于org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
位于org.glassfish.grizzly.http.server。 HttpHandler.doHandle(HttpHandler.java:168)
在org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
在org.glassfish.grizzly.filterchain.ExecutorResolver $ 9 .execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain .java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.pro (org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport。))中的
。 java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access $ 100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy $ WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
在org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:724)

Persistence.xml (爆炸文件loc ation:trainer / target / classes / META-INF /)
文件在发生错误时未被修改,但我重新创建了文件以确保其安全)

 <?xml version =1.0encoding =UTF-8?> 
< persistence version =2.1xmlns =http://xmlns.jcp.org/xml/ns/persistencexmlns:xsi =http://www.w3.org/2001/XMLSchema-实例xsi:schemaLocation =http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd\">
< persistence-unit name =Trainer_PUtransaction-type =JTA>
< provider> org.eclipse.persistence.jpa.PersistenceProvider< / provider>
< jta-data-source> jdbc / myDatasource< / jta-data-source>
< exclude-unlisted-classes> false< / exclude-unlisted-classes>
<属性>
< property name =javax.persistence.schema-generation.database.actionvalue =drop-and-create/>
< / properties>
< / persistence-unit>
< /余辉>


解决方案

关于此问题的更多详细信息。
我使用的代码示例创建了几个约束验证器 - 一个检查用户名是否唯一,另一个是电子邮件格式是正确的。所需的接口使用ConstraintPayload类,因为我正在使用Maven原型,我正式搜索所需的依赖项和存储库条目( Maven Hub )。有两种可供选择 - 我选择了第一个,因为它特别提到了Glassfish - 这导致我的原始问题中描述的持续性单元错误导致部署立即崩溃。幸运的是,第二项似乎有效(尽管我还没有实际测试过验证器类!)似乎存在一些冲突,但我不清楚具体细节。



作为参考,约束验证器代码的示例如下:

  package com.jsfcompref.trainer.entity; 


import javax.validation.Constraint;
import javax.validation.ConstraintPayload;

@Documented
@Constraint(validatedBy = UseridUniquenessConstraintValidator.class)
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME )
public @interface UseridUniquenessConstraint {

String message()default具有该用户标识的用户已存在;

Class<?> [] groups()default {};

类<? extends ConstraintPayload> [] payload()default {};

----

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class UseridUniquenessConstraintValidator implements
ConstraintValidator< UseridUniquenessConstraint,String> {

public boolean isValid(String value,ConstraintValidatorContext ctx){


UserRegistry registry = UserRegistry.getCurrentInstance();
布尔结果= true;

if(null!= registry){
result =(null!= registry.getUserByUserid(value));
}
返回结果;


public void initialize(UseridUniquenessConstraint arg0){
}

}
$ b $

导致此问题的Maven pom条目:

 < dependency> 
< groupId> org.glassfish.extras< / groupId>
< artifactId> glassfish-embedded-all< / artifactId>
< version> 3.0-b69< / version>
< /依赖关系>

< repository>
< id> glassfish< / id>
<名称> Glassfish< / name>
< url> https://repository.jboss.org/nexus/content/repositories/glassfish< / url>
< / repository>

修正了导致成功部署的Maven pom条目(原本我没有去到Hibernate和我使用默认的JPA2.1 Eclipselink提供...但是,他们是JSR(303),所以可能实际上是更新的,因此与Glassfish 4兼容)

 < dependency> 
< groupId> org.glassfish< / groupId>
< artifactId> bean验证器< / artifactId>
< version> 3.0-JBoss-4.0.0.Beta3A< / version>
< /依赖关系>

< repository>
< id> java.net2< / id>
< name> Java.net< / name>
< url> https://oss.sonatype.org/content/repositories/java.net2< / url>
< / repository>


I've been adapting a code sample from the JSF2.0 Complete Reference textbook (the Virtual Trainer application) to run using CDI. All was going well until I started adding some of the JSF code at which point the deployment began to repeatedly fail stating that it could not resolve a persistence unit. I was somewhat puzzled as I hadn't touched any of my entity code or controller beans but rolled the application back anyway (manually - I didn't have it attached to Subversion a the time). Despite this, the error persists so something has changed but I can't find it! Others have reported an identical error that was associated with a misplaced persistence.xml file but my copy seems to be deployed correctly as far as I can tell.

The project is based on a Maven Java EE Web Archetype and I'm using Netbeans 7.4 (final), Java EE7 and Glassfish 4. It's also worth noting that as I started to write some JSF pages, Netbeans seemed to develop hiccups as it didn't recognise some of the tags (e.g. ) so I suspect there is a bug there.

I'd be really grateful if anyone has any ideas!

Stacktrace as follows:

SEVERE:   Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
SEVERE:   java.lang.RuntimeException: Could not resolve a persistence unit corresponding to the persistence-context-ref-name [com.sun.ejb.containers.TimerBean/em] in the scope of the module called [trainer]. Please verify your application.
    at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:727)
    at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:715)
    at org.glassfish.web.deployment.descriptor.WebBundleDescriptorImpl.findReferencedPUs(WebBundleDescriptorImpl.java:996)
    at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:186)
    at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:168)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:922)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:431)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:356)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
    at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
    at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:724)
SEVERE:   Exception while preparing the app
SEVERE:   Exception during lifecycle processing
java.lang.RuntimeException: Could not resolve a persistence unit corresponding to the persistence-context-ref-name [com.sun.ejb.containers.TimerBean/em] in the scope of the module called [trainer]. Please verify your application.
    at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUViaEMRef(BundleDescriptor.java:727)
    at com.sun.enterprise.deployment.BundleDescriptor.findReferencedPUsViaPCRefs(BundleDescriptor.java:715)
    at org.glassfish.web.deployment.descriptor.WebBundleDescriptorImpl.findReferencedPUs(WebBundleDescriptorImpl.java:996)
    at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:186)
    at org.glassfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:168)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:922)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:431)
    at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:219)
    at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:491)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:527)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2$1.run(CommandRunnerImpl.java:523)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:356)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$2.execute(CommandRunnerImpl.java:522)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:546)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1423)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1500(CommandRunnerImpl.java:108)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1762)
    at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1674)
    at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:534)
    at com.sun.enterprise.v3.admin.AdminAdapter.onMissingResource(AdminAdapter.java:224)
    at org.glassfish.grizzly.http.server.StaticHttpHandler.service(StaticHttpHandler.java:297)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:246)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:724)

Persistence.xml (exploded file location: trainer/target/classes/META-INF/) File was not changed at the time the error occurred but I recreated the file to be sure)

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="Trainer_PU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/myDatasource</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
    </properties>
  </persistence-unit>
</persistence>

解决方案

Further detail on the issue. The code example I'm using creates a couple of constraint validators - one checks that usernames are unique, the other that email formats are correct. The interfaces required utilise the ConstraintPayload class and as I was using a Maven archetype I duly searched for the required dependency and repository entries (Maven Hub). There were two to choose from - I selected the first as it mentioned Glassfish specifically - this caused an immediate crash on deployment with the Persistence Unit error described in my original question. Fortunately the second entry appears to work (although I haven't actually tested the validator classes as of yet!) It would appear that there was some conflict but I am unclear as to the exact details.

For reference, examples of constraint validator code:

package com.jsfcompref.trainer.entity;


import javax.validation.Constraint;
import javax.validation.ConstraintPayload;

@Documented
@Constraint(validatedBy = UseridUniquenessConstraintValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UseridUniquenessConstraint {

    String message() default "A user with that userid already exists";

    Class<?>[] groups() default {};

    Class<? extends ConstraintPayload>[] payload() default {};   

----

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class UseridUniquenessConstraintValidator implements
        ConstraintValidator<UseridUniquenessConstraint, String> {

    public boolean isValid(String value, ConstraintValidatorContext ctx) {


        UserRegistry registry = UserRegistry.getCurrentInstance();
        boolean result = true;

        if (null != registry) {
            result = (null != registry.getUserByUserid(value));
        }
        return result;
    }

    public void initialize(UseridUniquenessConstraint arg0) {
    }

}

Maven pom entries that caused the issue:

<dependency>
        <groupId>org.glassfish.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.0-b69</version>
</dependency>

<repository>
        <id>glassfish</id>
        <name>Glassfish</name>
        <url>https://repository.jboss.org/nexus/content/repositories/glassfish</url>
</repository>

Amended Maven pom entries that lead to successful deployment (I didn't go for these originally as they relate to Hibernate and I'm using the default JPA2.1 Eclipselink provided...however, they are JSR(303) so may well actually be more recent and thus compatible with Glassfish 4)

<dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>bean-validator</artifactId>
        <version>3.0-JBoss-4.0.0.Beta3A</version>
</dependency>

<repository>
        <id>java.net2</id>
        <name>Java.net</name>
        <url>https://oss.sonatype.org/content/repositories/java.net2</url>
</repository>

这篇关于无法解决持久性单元错误 - Netbeans 7.3 / 7.4和Glassfish 4的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆