2016-04-14 10 views
1

Ich erstelle eine RESTful-Anwendung und ich habe Probleme, eine Konvertierung für eine neue Verbindung. Mein Anwendungsserver ist Wildfly 10.0.ClassCastException zwischen gleichen Klassen Wildfly 10

Datasource und Treiber im Standalone-full.xml:

<datasource jndi-name="java:jboss/datasources/PostgreDS" pool-name="PostgreDS" enabled="true" use-java-context="true"> 
    <connection-url>jdbc:postgresql://192.168.0.112:5432/bdns</connection-url> 
    <driver>postgresql</driver> 
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> 
    <pool> 
     <min-pool-size>10</min-pool-size> 
     <max-pool-size>40</max-pool-size> 
     <prefill>true</prefill> 
    </pool> 
    <security> 
     <user-name>sa</user-name> 
     <password>000000</password> 
    </security> 
    <statement> 
     <prepared-statement-cache-size>32</prepared-statement-cache-size> 
     <share-prepared-statements>true</share-prepared-statements> 
    </statement> 
</datasource> 
<drivers> 
    <driver name="postgresql" module="org.postgresql"> 
     <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class> 
    </driver> 
</drivers> 

Java-Code ConnectionMng.java:

package dao; 

import java.sql.Connection; 
import java.sql.SQLException; 

import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.sql.DataSource; 

import org.jboss.jca.adapters.jdbc.jdk7.WrappedConnectionJDK7; 
import org.postgresql.jdbc.PgConnection; 

public class ConnectionMng { 
    private DataSource ds; 

    private ConnectionMng() throws NamingException { 
     this.ds = (DataSource)new InitialContext().lookup("java:jboss/datasources/PostgreDS"); 
    } 

    public PgConnection getPgConnection() throws SQLException { 
     WrappedConnectionJDK7 wrappedConn = (WrappedConnectionJDK7)ds.getConnection(); 
     Connection underlyingConn = wrappedConn.getUnderlyingConnection(); 
     return (PgConnection)underlyingConn; 
    } 
} 

Ausnahme aufgetreten:

ClassCastException: org.jboss.jca.adapters.jdbc.jdk7.WrappedConnectionJDK7 cannot be cast to org.jboss.jca.adapters.jdbc.jdk7.WrappedConnectionJDK7 

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>Core</groupId> 
<artifactId>Core</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>war</packaging> 
<name>Core</name> 
<description>Core</description> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
    <javac.target>1.8</javac.target> 
    <postgresql.enforce.jdk.version>[1.7,1.8)</postgresql.enforce.jdk.version> 
</properties> 

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.3.RELEASE</version> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>org.wildfly</groupId> 
     <artifactId>wildfly-connector</artifactId> 
     <version>10.0.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>javax</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>7.0</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-dbcp2</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.9.13</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.12</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-fileupload</groupId> 
     <artifactId>commons-fileupload</artifactId> 
     <version>1.3.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.thoughtworks.xstream</groupId> 
     <artifactId>xstream</artifactId> 
     <version>1.4.8</version> 
    </dependency> 
    <dependency> 
     <groupId>com.github.junrar</groupId> 
     <artifactId>junrar</artifactId> 
     <version>0.7</version> 
    </dependency> 
    <dependency> 
     <groupId>org.zeroturnaround</groupId> 
     <artifactId>zt-zip</artifactId> 
     <version>1.9</version> 
     <type>jar</type> 
     <exclusions> 
      <exclusion> 
       <groupId>org.slf4j</groupId> 
       <artifactId>slf4j-log4j12</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
</dependencies> 

<build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <artifactId>maven-war-plugin</artifactId> 
      <configuration> 
       <warSourceDirectory>WebContent</warSourceDirectory> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Sorry, für mein Englisch!

Mit freundlichen Grüßen Dorcílio Neto.

+0

Können Sie Ihre Pom-Datei teilen? Was ist in deiner WAR-Datei? –

+0

Also welcher Typ wird von 'ds.getConnection()' zurückgegeben? –

+0

@JohnAment pom.xml wird hinzugefügt. –

Antwort

1

Die Antwort von aribeiro ist die richtige Antwort: Ein vom Build-Tool (Maven) gepacktes jar befindet sich im lib-Verzeichnis des Krieges und kollidiert mit dem wildfly-Classloader.

Zusätzliche, hier ist eine generische Lösung für das folgende Problem:

  • Sie JBoss 7 AS oder eine Wildfly AS
  • haben Sie arbeiten mit Eclipse JBoss-Tools
  • Sie eine EAR-Bereitstellung oder ein WAR, lib-Ordner wird von build-tool wie Maven
  • gepackt, es tritt ein Fehler auf: Beispielpaket.ExcampleClass kann nicht auf examplepackage.ExcampleClass gegossen werden

Meist passiert es, wenn Sie die Java EE-Spec verlassen und verwenden JBoss/Wildfly spezifische Module, ironjacamar, JSF-impl und so weiter. Maven legt die benötigten jars in das lib-Verzeichnis. Aber die Jars befinden sich bereits im Modul-Verzeichnis der AS. Nach meiner Erfahrung kann die nicht Fehler aus diesem Grund ausgelöst werden.

Sie müssen dann das Jar aus dem Lib-Verzeichnis in Maven entfernen, indem Sie die Abhängigkeit wie angegeben deklarieren.

Sagen Sie dem JBoss/Wildfly-Classloader, wo Sie die Klasse finden. Dies kann erfolgen durch:

Entweder eine Abhängigkeit von der MANIFEST.MF des Projekts. Eclipse-JBoss-Tools lädt die Klasse aus dem Server-Enviroment, sodass Sie die Abhängigkeit vom Pom entfernen können. Im currect Fall

Dependencies: org.jboss.ironjacamar.jdbcadapters 

Oder nutzen Sie den Jboss-Deployment-structure.xml, dann können Sie die Klasse mit Maven laden, aber erklären, vorgesehen als

<dependencies> 
     <module name="org.jboss.ironjacamar.jdbcadapters" /> 

Siehe auch https://docs.jboss.org/author/display/WFLY8/Class+Loading+in+WildFly

+0

Es hat funktioniert, danke! –

1

Offenbar haben Sie, wie bereits erwähnt, aufgrund eines Abhängigkeitskonflikts ein Classloader-Problem.

es zu lösen, sollten Sie Ihre Wildfly-Stecker Abhängigkeit markieren als zur Verfügung gestellt.

<dependency> 
    <groupId>org.wildfly</groupId> 
    <artifactId>wildfly-connector</artifactId> 
    <version>10.0.0.Final</version> 
    <scope>provided</scope> 
</dependency> 

WildFly enthält bereits das JAR. Wenn Sie zum folgenden Ordner gehen, können Sie ihn finden:

<wildfly-10.0.0.Final-dir>\modules\system\layers\base\org\jboss\as\connector\main 

Sie müssen es nicht mit Ihrer Anwendung packen.

Trotzdem, wie auf WildFly 10's Implicit module dependencies for deployments angegeben, muss man das JCA-Subsystem explizit auslösen.

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure> 
    <deployment> 
     <dependencies> 
      <module name="org.jboss.ironjacamar.jdbcadapters" slot="main"/>    
     </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

Dann fügen Sie Ihre jboss-Deployment-structure.xml auf die WEB-INF Ordner: Dafür kann man den Einsatz von jboss-Deployment-structure.xml mit folgendem Inhalt machen deines KRIEGES.