Spring Integration

Hi all!

First of all, thank you for this pretty framework. I’ve just started to use it and I love it!

I’ve read so many posts, faqs, tutorials and much more, but I’m still not able to keep my simple application with spring integrated working.

I’ve almost literally followed FAQ’s example at
Wiki
but when I run

mvn pckage tomcat7:run the application is deployed successfully but accessing the main page a NullPointerException is raised at bean.getLabel(); because the injection has not been made. It seems that all the configuration is good, but Spring does not inject the bean! How can it be? :wacko:

Thank you in advance, I hope someone can have good suggestions :*)
Luca

Here’s my code:


web.xml

	
<!-- Spring context loader -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/springWebContextConfig.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
    
	<!-- Vaadin servlet -->
    <servlet>
        <servlet-name>Vaadin Application Servlet</servlet-name>
        <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class>
        <init-param>
            <description>Vaadin application class to start</description>
            <param-name>application</param-name>
            <param-value>it.everis.vaadinspringexperiments.MyVaadinApplication</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Vaadin Application Servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>


springWebContextConfig.xml


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd            
	                       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd            
	                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd            
	                       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

	<context:property-placeholder location="classpath*:*.properties" />

	<!-- Turn on AspectJ @Configurable support -->
	<context:spring-configured />

	<context:component-scan base-package="it.everis" />
	

	<!-- Turn on @Autowired, @PostConstruct etc support -->
	<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
	<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
	
</beans>


MyVaadinApplication.java


/**
 * The Application's "main" class
 */
@SuppressWarnings("serial")
@Configurable(preConstruction = true)
public class MyVaadinApplication extends Application
{
    private Window window;
    
    @Autowired
    private InjectedBean bean;
    
    @Override
    public void init()
    {
    	/*
        SpringContextHelper helper = new SpringContextHelper(this);
        InjectedBean bean = (InjectedBean) helper.getBean("injectedBean");
    	*/
    	
    	final String textLabel = bean.getLabel();    	
    	
        window = new Window("My Vaadin Application");
        setMainWindow(window);
        Button button = new Button("Click Me");
        button.addListener(new Button.ClickListener() {
            public void buttonClick(ClickEvent event) {
                window.addComponent(new Label("Thank you for clicking (" +textLabel+ ")"));
            }
        });
        window.addComponent(button);
        
    }

	public InjectedBean getBean() {
		return bean;
	}

	public void setBean(InjectedBean bean) {
		this.bean = bean;
	}
}


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/XMLSchema-instance"
	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>it.everis</groupId>
	<artifactId>vaadinSpringExperiments</artifactId>
	<packaging>war</packaging>
	<version>LATEST</version>
	<name>Vaadin Web Application</name>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<vaadin.version>6.8.2</vaadin.version>
		<gwt.version>2.3.0</gwt.version>
		<gwt.plugin.version>2.2.0</gwt.plugin.version>
		<org.springframework.version>2.5.6</org.springframework.version>
	</properties>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.0-beta-1</version>
			</plugin>

			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>aspectj-maven-plugin</artifactId>
				<version>1.0</version>
				<dependencies>
					<dependency>
						<groupId>org.aspectj</groupId>
						<artifactId>aspectjrt</artifactId>
						<version>1.6.3</version>
					</dependency>
					<dependency>
						<groupId>org.aspectj</groupId>
						<artifactId>aspectjtools</artifactId>
						<version>1.6.3</version>
					</dependency>
				</dependencies>
				<executions>
					<execution>
						<goals>
							<goal>compile</goal>
							<goal>test-compile</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<aspectLibraries>
						<aspectLibrary>
							<groupId>org.springframework</groupId>
							<artifactId>spring-aspects</artifactId>
						</aspectLibrary>
					</aspectLibraries>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>vaadin-snapshots</id>
			<url>http://oss.sonatype.org/content/repositories/vaadin-snapshots/</url>
			<releases>
				<enabled>false</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>vaadin-addons</id>
			<url>http://maven.vaadin.com/vaadin-addons</url>
		</repository>
	</repositories>

	<dependencies>
		<dependency>
			<groupId>com.vaadin</groupId>
			<artifactId>vaadin</artifactId>
			<version>${vaadin.version}</version>
		</dependency>

		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.dellroad</groupId>
			<artifactId>dellroad-stuff-vaadin</artifactId>
			<version>1.0.507</version>
		</dependency>
	</dependencies>

</project>

Hi, Luca,
I’m just getting started at Spring, but I may have some tips/questions:

  • Does your InjectedBean class has an annotation (like @Component or @Service) to make it injectable by Spring?
  • Is it inside your “it.everis” base package to be found by Spring?

Good luck!

Otávio

Hi Otavio, thank you for your interest :wink:

Unfortunately I’m using @Component as bean class annotation and, of course, that class is owned by “it.everis.foo.goo”… and it still not work :mad:

It was a good point but not the solution :wink:

Thx,
Luca