在 servlet 的 init-param 类中使用 spring 自动装配

发布于 2024-12-20 20:17:05 字数 3207 浏览 3 评论 0原文

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

 }

I am having some difficulty auto-wiring beans into a class which is loaded as an init-param in a servlet for OData4j. I have tried many solutions including load-time-weaving but cannot seem to get it to work correctly because as I understand it, the class which is being passed as an init-param to the servlet is being loaded prior to Spring context being loaded at all. Below is the current state of my configuration, is there a way to have dependency injection in a class loaded in such a way? The end goal is to have the ExampleProducerFactory.java (which is an init-param of the OData servlet) having the UserDao bean autowired.

I have tried to just include the key pieces of each of these files, if there is additional configuration information needed, please comment.

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

 }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放赐 2024-12-27 20:17:05

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

You should use the jersey SpringServlet instead of the ServletContrainer. With that instead of specifying resourceConfig in the init param you can define it as a spring bean.

天邊彩虹 2024-12-27 20:17:05

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

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

A bean must be created in your spring config to inject into your class.

 <bean id="userDao" class="com.yourdomain.pacakage.UserDao">
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文