2014-01-11 4 views
2

스프링 프레임 워크/데이터/HATEOAS를 사용 중이며 Dozer를 추가하려고합니다.스프링 주입 빈이 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; 
    } 
} 

그래서를 - 나는 콩 주입 아주 새로운 해요 -하지만 나는 공장 콩이 있다고 생각 하나? 매퍼를 삽입합니다. 하지만 Mapper는 확실히 null입니다. 나는이 일을 제대로하지 않는다는 것을 알고 있지만, 내가 뭘 잘못하고 있니?

답변

1

스프링은 콩을 스프링 관리 빈에 삽입합니다. 관리되지 않는 정적 컨텍스트를 사용하고 있습니다. 뿐만 아니라 관리 빈에 UserResourceAssembler 변경 :

@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
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; 
    } 
}