0
votes

I'm developing an GWT web app using some Spring libraries. I use Maven to include my dependencies.

Here's my pom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>be.jon</groupId>
    <artifactId>bibliosgwt</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>GWT Maven Archetype</name>

    <properties>
        <!-- Convenience property to set the GWT version -->
        <gwtVersion>2.7.0</gwtVersion>

        <!-- GWT needs at least java 1.6 -->
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.google.gwt</groupId>
                <artifactId>gwt</artifactId>
                <version>${gwtVersion}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-servlet</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-user</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt-dev</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.jolbox</groupId>
            <artifactId>bonecp-spring</artifactId>
            <version>0.8.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.7.1.RELEASE</version>
        </dependency>

        // DEPENDENCY PROBLEM
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.3.RELEASE</version>
        </dependency>
        //
    </dependencies>

    <build>
        <!-- Output classes directly into the webapp, so that IDEs and "mvn process-classes" 
            update them in DevMode -->
        <outputDirectory>${project.build.directory}/${project.build.finalName}/WEBINF/classes</outputDirectory>

        <plugins>

            <!-- GWT Maven Plugin -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>gwt-maven-plugin</artifactId>
                <version>2.7.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>test</goal>
                            <!-- <goal>generateAsync</goal> -->
                        </goals>
                    </execution>
                </executions>
                <!-- Plugin configuration. There are many available options, see gwt-maven-plugin 
                    documentation at codehaus.org -->
                <configuration>
                    <runTarget>bibliosgwt.html</runTarget>
                    <modules>
                        <module>be.jon.bibliosgwt.bibliosgwt</module>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Here's my application-context.xml :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="http://www.springframework.org/schema/data/jpa            http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-    beans.xsd">

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <!-- Tell hibernate to use our given datasource -->
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
    <property name="packagesToScan">
        <value>be.jon.bibliosgwt.shared.Entities</value>
    </property>
</bean>

<jpa:repositories base-package="be.jon.biliosgwt.server.repositories"/>

<!-- Spring bean configuration. Tell Spring to bounce off BoneCP -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <property name="targetDataSource" ref="mainDataSource"/>
</bean>

<!-- BoneCP configuration -->
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql:/localhost:3306/bibliosgwt" />
    <property name="username" value="root" />
    <property name="password" value="" />
    <property name="idleConnectionTestPeriod" value="60" />
    <property name="idleMaxAge" value="240" />
    <property name="maxConnectionsPerPartition" value="60" />
    <property name="minConnectionsPerPartition" value="20" />
    <property name="partitionCount" value="3" />
    <property name="acquireIncrement" value="10" />
    <property name="statementsCacheSize" value="50" />
    <property name="releaseHelperThreads" value="3" />
</bean>

<bean id="greetService" class="be.jon.bibliosgwt.server.GreetingServiceImpl"></bean>

Everything is ok but when I include the Spring-Web dependency. I have a problem starting the project. The following exception occurs :

 [WARN] Failed startup of context c.g.g.d.s.j.WebAppContextWithReload{/,file:/D:/Users/Yeap/workspace-sts

3.6.2.RELEASE/testproject/target/testproject-0.0.1-SNAPSHOT/},D:\Users\Yeap\workspace-sts 3.6.2.RELEASE\testproject\target\testproject-0.0.1-SNAPSHOT org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/data/jpa] Offending resource: ServletContext resource [/WEB-INF/application-context.xml]

I don't understand where the problem is... I thought about a SchemaLocation Namespace issue but I've tried all the versions possibilities and not a single is good.

1
It sounds strange. The error indicates that something is wrong with the jpa dependency but it pops up when adding the web dependency. - Andy Dufresne
There might be bugs in the webapp classloader in DevMode (assuming you're using mvn gwt:run here); it's recommended that you use distinct Maven modules for client-side vs. server-side code, and use mvn jetty:run or mvn tomcat7:run to launch your webapp (and DevMode in noserver mode) - Thomas Broyer

1 Answers

0
votes

I can see a couple of things that work against each other

  1. Mixing spring versions 4.1.4 and 4.1.3
  2. Spring Data JPA depends on 4.0.7 version of spring
  3. Your beans namespace contains spaces/tabs?
  4. Use a version less schema declaration.

To manage your dependencies, and to prevent mixing versions it is recommended to use the Spring Framework BOM, just like you use the one from GWT. This will save you a couple of headaches.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.gwt</groupId>
            <artifactId>gwt</artifactId>
            <version>${gwtVersion}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.1.4.RELEASE</version>            
            <type>pom</type>
            <scope>import</scope>
        </dependency>            
    </dependencies>
</dependencyManagement>

<dependencies>       
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.7.1.RELEASE</version>
    </dependency>
    // Other dependencies
</dependencies>

Next your namespace declaration is a bit erroneous and it is recommended to use the version less XSDs.

xsi:schemaLocation="
    http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">