Jpa 无法解决持久性单元错误-Netbeans 7.3/7.4和Glassfish 4
我一直在修改JSF2.0完整参考教科书(虚拟培训师应用程序)中的代码示例,以使用CDI运行。一切都进行得很顺利,直到我开始添加一些JSF代码,这时部署开始反复失败,声明它无法解析持久性单元。我有点困惑,因为我没有接触任何实体代码或控制器bean,但无论如何都会回滚应用程序(手动-我当时没有将其连接到Subversion a)。尽管如此,错误仍然存在,因此某些内容已更改,但我找不到它!其他人报告了与放置错误的persistence.xml文件相关的相同错误,但据我所知,我的副本似乎已正确部署 该项目基于Maven Java EE Web原型,我使用的是Netbeans 7.4(最终版)、Java EE7和Glassfish 4。还值得注意的是,当我开始编写一些JSF页面时,Netbeans似乎出现了问题,因为它无法识别一些标记(例如),所以我怀疑那里有一个bug 如果有人有任何想法,我将不胜感激 Stacktrace如下所示:Jpa 无法解决持久性单元错误-Netbeans 7.3/7.4和Glassfish 4,jpa,glassfish,eclipselink,netbeans-7.4,Jpa,Glassfish,Eclipselink,Netbeans 7.4,我一直在修改JSF2.0完整参考教科书(虚拟培训师应用程序)中的代码示例,以使用CDI运行。一切都进行得很顺利,直到我开始添加一些JSF代码,这时部署开始反复失败,声明它无法解析持久性单元。我有点困惑,因为我没有接触任何实体代码或控制器bean,但无论如何都会回滚应用程序(手动-我当时没有将其连接到Subversion a)。尽管如此,错误仍然存在,因此某些内容已更改,但我找不到它!其他人报告了与放置错误的persistence.xml文件相关的相同错误,但据我所知,我的副本似乎已正确部署 该项
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(分解文件位置:trainer/target/classes/META-INF/)
发生错误时文件未更改,但我重新创建了该文件以确保)
org.eclipse.persistence.jpa.PersistenceProvider
jdbc/myDatasource
假的
关于这个问题的更多细节。
我使用的代码示例创建了两个约束验证器——一个检查用户名是否唯一,另一个检查电子邮件格式是否正确。所需的接口使用ConstraintPayload类,当我使用Maven原型时,我适当地搜索了所需的依赖项和存储库条目()。有两个选项可供选择——我选择了第一个,因为它特别提到了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 "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) {
}
}
package com.jsfcompref.trainer.entity;
导入javax.validation.Constraint;
导入javax.validation.ConstraintPayload;
@记录
@约束(validatedBy=userIDUniquencessConstraintValidator.class)
@目标({ElementType.METHOD,ElementType.FIELD})
@保留(RetentionPolicy.RUNTIME)
public@interface useridUniquencessConstraint{
String message()默认值“具有该用户ID的用户已存在”;
类[]组()默认值{};
类问题已解决!似乎存在与Maven存储库相关的冲突,我必须添加该存储库才能在EmailConstraint接口中使用javax.validation.constraintpayload。。。
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) {
}
}
<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>
<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>