当前位置: 首页 > 知识库问答 >
问题:

Tomee与Arquillian使用Postgres DB用户缺少权限或找不到对象

向泽语
2023-03-14

我在使用 tomee 对后记数据库运行阿奎利亚测试时遇到问题。有了网络上的所有信息,我仍然在努力解决问题。

javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is: 
    Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: CREDENTIALS
Error Code: -5501
Call: SELECT ID, PASSWORD, USERNAME FROM credentials WHERE (USERNAME = ?)
    bind => [phil]

数据库:

名称:注册表

表:凭据

位于手动创建的架构下:postgres

坚持不懈src/main/resources目录下的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="registry" transaction-type="JTA">
    <jta-data-source>RegistryDS</jta-data-source>
    <non-jta-data-source>UnmanagedRegistryDS</non-jta-data-source>
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>za.co.registry.client.login.Credentials</class>
    <properties>
      <property name="eclipselink.debug" value="OFF"/>
      <property name="eclipselink.weaving" value="static"/>
      <property name="eclipselink.logging.level.sql" value="FINE"/>
      <property name="eclipselink.logging.parameters" value="true"/>
      <property name="eclipselink.logging.logger" value="DefaultLogger"/>
    </properties>
  </persistence-unit>
</persistence>

tomee.xml文件

<Resource id="RegistryDS" type="DataSource">
          jdbcDriver=org.postgresql.Driver
          jdbcUrl=jdbc:postgresql://127.0.0.1:5432/registry
          userName=postgres 
          password=postgres 
          JtaManaged=true
</Resource>
<Resource id="UnmanagedRegistryDS" type="DataSource">
          jdbcDriver=org.postgresql.Driver
          jdbcUrl=jdbc:postgresql://127.0.0.1:5432/registry
          userName=postgres 
          password=postgres 
          JtaManaged=false
</Resource>

arquillian测试的pom.xml提取

<dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>arquillian-tomee-embedded</artifactId>
    <version>1.6.0</version>
    <scope>test</scope>
</dependency> 

<dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <version>1.0.3.Final</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>  

阿奎利安.xml提取物

<container qualifier="tomee" default="true">
    <configuration>
        <property name="httpPort">-1</property>
        <property name="stopPort">-1</property>
        <property name="dir">target/apache-tomee-remote</property>
        <property name="appWorkingDir">target/arquillian-test-working-dir</property>
        <property name="properties" />
    </configuration>
</container>

加载资源时.java测试文件。

    @Deployment
    public static WebArchive createDeployment() {
        WebArchive webArchive = newArchive();
        webArchive.addClasses(Credentials.class);
        webArchive.addAsResource("META-INF/persistence.xml");
        webArchive.addAsResource("META-INF/beans.xml");
        return webArchive;
    }

最后是< code>ServiceTest.java中的test < code > findCredentialsByUsernameTest 方法

@Test
public void findCredentialsByUsernameTest() {
    Credentials login = LoginService.findByUsername("phil");
    Assert.assertNotNull(login);
}

我没有在测试类中开始或结束任何< code>EntityTransaction。

当服务中的数据库调用被移除时,它注入一个EJB。我在配置中遗漏了什么,或者做错了什么,导致它无法工作?

共有1个答案

卢黎明
2023-03-14

好吧,我想我知道我做错了什么。

我需要对嵌入式数据库进行测试。

我遵循的让Arquillian测试针对嵌入式数据库工作的步骤;

从tomee.xml中删除了非托管数据源,我添加它是因为我想在测试中使用它。另一个数据源仍然存在,因为它是在部署到tomee以连接postgres db时使用的。

<Resource id="UnmanagedRegistryDS" type="DataSource">
          jdbcDriver=org.postgresql.Driver
          jdbcUrl=jdbc:postgresql://127.0.0.1:5432/registry
          userName=postgres 
          password=postgres 
          JtaManaged=false
</Resource>

我要连接到哈密数据库。

HSQLDB (HyperSQL DataBase) is the leading SQL relational database software written in Java. It offers a small, fast multithreaded and transactional database engine with in-memory and disk-based tables and supports embedded and server modes

接下来,我创建第二个持久性.xml src/测试/资源中,称为测试持久性.xml。请记住它将在 arquillian 中使用的持久性单元名称 test数据库.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
             version="2.0">
    <persistence-unit name="test" transaction-type="JTA">
        <jta-data-source>testDatabase</jta-data-source>
        <class>za.co.registry.client.login.Credentials</class>
        <properties>
            <property name="openejb.jpa.init-entitymanager" value="true" />
            <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" />
        </properties>
    </persistence-unit>
</persistence>

arquillian.xml,我在文件中设置testDatabase持久性单元属性。请参见下面的属性。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<arquillian
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
    <container qualifier="openejb-embedded" default="true">
        <configuration>
            <property name="httpPort">-1</property>
            <property name="stopPort">-1</property>
            <property name="dir">target/apache-tomee-remote</property>
            <property name="appWorkingDir">target/arquillian-test-working-dir</property>
            <property name="properties">
                testDatabase = new://Resource?type=DataSource
                testDatabase.JdbcUrl = jdbc:hsqldb:mem:my-datasource
             </property>
        </configuration>
    </container>
</arquillian>

配置我的ServiceTest.java文件以包含新的persistence.xml文件。

webArchive.addAsWebInfResource("META-INF/test-persistence.xml", "persistence.xml");
webArchive.addAsResource("META-INF/beans.xml");

现在我可以运行findCredentialsByUsernameTest方法。

    @Test
    public void findCredentialsByUsernameTest() {
        //create credentials first
        Credentials newCredentials = loginService.newCredentials(new Credentials("john", "password"));

        //search for credentails
        Credentials login = loginService.findByUsername("john");
        Assert.assertNotNull(login);
        Assert.assertEquals(newCredentials.getUsername(), login.getUsername());
    }
 类似资料:
  • 所以我已经在谷歌和stack上搜索过了,我找到了一堆有同样错误的人,但是没有一个解决方案能解决我的问题。 我正在使用的: Java 8 JavaEE7 TomEE 7.0 M3 JPA 2.0 ORM 1.0 Postgres公司 我认为问题在于命名查询,也许还有ManyToMany关系。 User.java SystemRole.java 持久性.xml user-orm.xml context

  • 项目可以编译,但是当我尝试: 或者我试试: 返回错误: javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:无法准备语句 更新: 根异常是: 原因: 组织.hsqldb.Hsql异常: 用户缺少特权或找不到对象: 供应商信息 我尝试从server.xml中删除池(资源),但项目没有失败

  • 我遵循了以下基本的Spring批量教程https://spring.io/guides/gs/batch-processing/ . > 我正在使用IntelliJ 14并创建了一个Spring批处理项目 我在用Mavin。我还有pom。xml文件。 Mvn clean install运行良好,即使应用程序。java告诉我“无法自动连线。找不到JdbcTemplate类型的bean”@Autowi

  • 我在hsqldb测试中遇到了一点问题。 我在import.sql中添加了我需要的所有内容,它工作得很好。 我创建了一个类: 但是我得到了这个错误:

  • 我发现这个错误在整个互联网上出现了很多次,但我根本没有找到适合我的情况的解决方案。我有一个 HSQL 数据库 - 我已成功连接到数据库中的一个表。我继续在数据库中创建另一个表 - 根据需要修改完全相同的 Java 代码,但它带来了错误:java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:USER。 我发现在我的文件存储脚本中,PRODUCT表创建的代码就在那