【问题标题】:Spring injected bean is nullSpring注入的bean为空
【发布时间】:2014-01-11 03:02:52
【问题描述】:

我正在使用 Spring Framework / Data / HATEOAS 并尝试添加 Dozer。

我的 spring-config.xml 中有以下 bean:

<?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 和注射非常陌生 - 但我猜工厂 bean 是?假设?注入映射器。但是 Mapper 绝对是空的。我知道我做的不对,但我做错了什么?

【问题讨论】:

    标签: spring javabeans dozer


    【解决方案1】:

    Spring 将其 bean 注入 Spring 管理的 bean。您正在使用非托管静态上下文。将 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

    【讨论】:

    • 好的,很高兴知道,我阅读了这个和链接的答案。不幸的是,同样的事情正在发生。我已经用当前代码更新了问题。
    • 我将
    【解决方案2】:

    我更喜欢上面的东西。但后来我读到:

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

    【讨论】:

      猜你喜欢
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2012-02-19
      • 2017-02-27
      相关资源
      最近更新 更多