【问题标题】:Auto-wiring with spring in an init-param class of a servlet在 servlet 的 init-param 类中使用 spring 自动装配
【发布时间】:2012-01-19 16:26:47
【问题描述】:

我在将 bean 自动连接到一个类中时遇到了一些困难,该类作为 OData4j 的 servlet 中的 init-param 加载。我尝试了许多解决方案,包括加载时间编织,但似乎无法使其正常工作,因为据我了解,作为 init-param 传递给 servlet 的类是在加载 Spring 上下文之前加载的全部。下面是我的配置的当前状态,有没有办法在以这种方式加载的类中进行依赖注入?最终目标是让 ExampleProducerFactory.java(它是 OData servlet 的初始化参数)自动装配 UserDao bean。

我已尝试仅包含每个文件的关键部分,如果需要其他配置信息,请发表评论。

applicationContext.xml

 <context:component-scan base-package="com.project.core"/>
 <context:spring-configured/>
 <context:load-time-weaver weaver-class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" />

web.xml

 <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- read the XmlWebApplicationContext for spring -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

 <servlet>
  <servlet-name>OData</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
     <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
     <param-value>org.odata4j.producer.resources.ODataResourceConfig</param-value>
    </init-param>
   <init-param>
       <param-name>odata4j.producerfactory</param-name>
       <param-value>com.wildgigs.core.odata.ExampleProducerFactory</param-value>
   </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>OData</servlet-name>
    <url-pattern>/example.svc/*</url-pattern>
</servlet-mapping>

ExampleProducerFactory.java

 @Configurable(autowire= Autowire.BY_NAME)
 public class ExampleProducerFactory implements ODataProducerFactory {

@Autowired
private UserDao userDao;

@Override
public ODataProducer create(Properties arg0) {
    InMemoryProducer producer = new InMemoryProducer("example");
    List<User> users = userDao.findAll();
    User[] usersArray = new User[users.size()];
    users.toArray(usersArray);
    final User[] usersArrayFinal = usersArray;
     producer.register(User.class, Long.class, "Users", new Func<Iterable<User>>() {
         public Iterable<User> apply() {
             ThreadGroup tg = Thread.currentThread().getThreadGroup();
             while (tg.getParent() != null)
                 tg = tg.getParent();
             return Enumerable.create(usersArrayFinal).take(usersArrayFinal.length);
         }
     }, "Id");


     return producer;
}
}

UserDaoImpl.java

 @Repository
 public class UserDaoImpl extends GenericDaoImpl<User, Long> implements UserDao,      Serializable {

 @Transactional(readOnly = true)
 public User getByUserName(String userName) {
      Query query = getSession().createQuery("FROM User where upper(userName) = :name");
      query.setString("name", userName.toUpperCase());
      return (User) query.uniqueResult();
 }

 }

【问题讨论】:

    标签: java spring servlets odata4j


    【解决方案1】:

    您应该使用球衣 SpringServlet 而不是 ServletContrainer。使用它而不是在 init 参数中指定 resourceConfig,您可以将其定义为 spring bean。

    【讨论】:

      【解决方案2】:

      必须在你的 spring 配置中创建一个 bean 才能注入到你的类中。

       <bean id="userDao" class="com.yourdomain.pacakage.UserDao">
      

      【讨论】:

      • 对不起,我忘了提到 UserDao 是用 @Repository 注释的,并且在项目的其他任何地方都正确地自动装配。现在添加到原始问题中。
      • UserDaoImpl 正在自动装配,它是 UserDao 的子类。问题不应该出在 bean 本身的配置中,UserDao/UserDaoImpl 在应用程序的每个其他位置,在标准组件/控制器/服务等中正确地自动连接。
      猜你喜欢
      • 2015-06-05
      • 1970-01-01
      • 2014-07-26
      • 2014-04-30
      • 2012-01-30
      • 2012-08-04
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多