2014-01-11 78 views
2

我正在使用Spring Framework/Data/HATEOAS並嘗試添加Dozer。Spring注入bean爲null

我在春天-config.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:data="http://www.springframework.org/schema/data/jpa" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
      http://www.springframework.org/schema/data/jpa 
      http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="database" value="POSTGRESQL" /> 
     <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" /> 
    </bean> 

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaDialect" ref="jpaDialect" /> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="jdbc:postgresql://localhost:5432/cp" /> 
     <property name="username" value="cp_user" /> 
     <property name="password" value="+JMJ+pw0m2d" /> 
    </bean> 

    <context:component-scan base-package="com.mydomain.data.assembler" /> 
    <data:repositories base-package="com.mydomain.repository" /> 

    <mvc:annotation-driven /> 

    <bean id="dozerFactory" class="org.dozer.spring.DozerBeanMapperFactoryBean" scope="singleton"> 
     <property name="mappingFiles" value="classpath*:/*mapping.xml"/> 
    </bean> 

</beans> 

與以下彙編:

@Component 
public class UserResourceAssembler { 

    @Inject 
    private Mapper dozerBeanMapper; 

    public UserResource toResource(User user) { 
     UserResource resource = dozerBeanMapper.map(user, UserResource.class); 
     resource.add(linkTo(methodOn(UserController.class).get(user.getId())).withSelfRel()); 
     return resource; 
    } 

    public User toEntity(UserResource resource) { 
     User user = dozerBeanMapper.map(resource, User.class); 
     return user; 
    } 
} 

所以, - 我很新的豆類和注射 - 但我猜工廠bean是?假設?注入Mapper。但是Mapper肯定是空的。我知道我沒有這樣做,但我做錯了什麼?

回答

1

春季將其豆類注入春季管理的豆類。您正在使用非託管靜態上下文。更改UserResourceAssembler成一個託管bean以及:

@Component 
public class UserResourceAssembler { 

    @Inject 
    private Mapper dozerBeanMapper; 

    public UserResource toResource(User user) { 
    } 

    public User toEntity(UserResource resource) { 
    } 

} 

why can't we autowire static fields in spring

+0

確定這是很好的瞭解,我讀這兩者和鏈接的答案。不幸的是同樣的事情正在發生。我用當前的代碼更新了這個問題。 – Lurk21

+0

我將 Lurk21

0

我會喜歡上面的東西。但後來我讀:

Dozer Singleton Startup Bean injetced as Null

這工作。這是我的實現。

我從spring-config中刪除了bean,並進行了上下文掃描。

我加入這個類:

@Singleton 
public class DozerInstantiator { 
    public static DozerBeanMapper getInstance(){ 
     return MapperHolder.instance; 
    } 

    private static class MapperHolder{ 
     static final DozerBeanMapper instance = new DozerBeanMapper(); 
    } 
} 

並更新了彙編程序是這樣的:

public class UserResourceAssembler { 

    private DozerBeanMapper mapper; 

    public UserResourceAssembler() { 
     mapper = DozerInstantiator.getInstance(); 
    } 

    public UserResource toResource(User user) {  
     UserResource resource = mapper.map(user, UserResource.class); 
     resource.add(linkTo(methodOn(UserController.class).get(user.getId())).withSelfRel()); 
     return resource; 
    } 

    public User toEntity(UserResource resource) { 
     User user = mapper.map(resource, User.class); 
     return user; 
    } 
}