使用Spring IoC向Restlet ServerResource注入依赖项

时间:2012-07-17 21:37:15

标签: spring dependencies inversion-of-control code-injection restlet

我正在使用Spring / Hibernate / Restlet / Jetty构建REST服务,我正在努力完成我认为的简单任务:

我需要将DAO实现(即UserDao)注入ServerResource(在本例中为UserServerResource)。

我正在使用SpringRouter bean在Spring XML配置中建立到此资源的路由:

<bean name="restlet-user-server-resource"
      class="project.server.rest.UserServerResource" 
      scope="prototype" />

<bean name="restlet-api-server-application"
      class="org.restlet.Application">
        <property name="inboundRoot">
        <bean class="org.restlet.ext.spring.SpringRouter">
            <constructor-arg ref="restlet-api-server-application" />
            <property name="attachments">
            <map>
                <entry key="/user/{userId}"
                       value-ref="restlet-user-server-resource" />
            </map>
            </property>
        </bean>
    </property>
</bean>

我尝试将DAO注入@Autowired和bean属性(在“restlet-user-server-resource”bean p:userDao-ref =“user-dao”中)。

UserDao指定为:

<bean name="user-dao,userDao"
      parent="dao-tx-template">

    <property name="target">
        <bean class="project.server.data.dao.UserDao"
              p:sessionFactory-ref="session-factory" />
    </property>
</bean>

应该注意,getBean('user-dao')按预期工作并返回UserDao的完全准备的实例。

我试过以下:

  1. 当需要使用Spring上下文中的getBean直接使用restlet-user-server-resource bean时,内部userDao为null。
  2. 当Restlet直接实例化UserServerResource类时(因此,为SpringRouter提供了字符串而不是ref),内部userDao为null。
  3. 当Spring如上所述实例化bean时,内部userDao为空。
  4. 此外,在(1)和(3)中,Restlet发出错误:在映射中找到未知对象。只允许Restlet的实例和org.restlet.resource.Resource和ServerResource的子类。

    添加当前的UserServerResource实现(这不是什么,只是用于基础结构设置的模拟):

    package project.server.rest;
    
    import org.restlet.resource.ResourceException;
    import org.restlet.resource.ServerResource;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Configurable;
    
    import project.server.data.dao.UserDao;
    import project.server.data.entities.User;
    import project.server.rest.interfaces.UserResource;
    
    @Configurable
    public class UserServerResource 
    extends ServerResource 
    implements UserResource 
    {
        private int userId;
    
        @Autowired
        private UserDao userDao;
    
        @Override
        public void doInit() throws ResourceException
        {
            String userIdString = (String)this.getRequestAttributes().get("userId");
            this.userId = Integer.parseInt(userIdString);
        }
    
        @Override
        public User represent() 
        {
            System.out.println(this.userDao);
    
            User user = new User();
            user.setId(this.userId);
            user.setUserName("Something");
            user.setEmailAddress("some@address.com");
            return (user);
        }
    
        public void setUserDao(UserDao dao)
        {
            this.userDao = dao;
        }
    
        public UserDao getUserDao()
        {
            return (this.userDao);
        }
    }
    

    我希望我提供尽可能多的信息。 谢谢你的任何建议!

1 个答案:

答案 0 :(得分:0)

好的,我已经做了一些绝望的谷歌搜索,并再次找到了Restlet的Spring扩展手册页,但现在,不要错过重要的一点,最终解决了我的斗争。这是解决方案:

<bean name="restlet-user-server-resource"
      class="project.server.rest.UserServerResource" 
      scope="prototype" 
      p:userDao-ref="user-dao" />

<bean name="restlet-api-server-application"
      class="org.restlet.Application">
        <property name="inboundRoot">
        <bean class="org.restlet.ext.spring.SpringRouter">
            <constructor-arg ref="restlet-api-server-application" />
            <property name="attachments">
            <map>
                <entry key="/user/{userId}">
                    <bean class="org.restlet.ext.spring.SpringFinder">
                        <lookup-method name="create" bean="restlet-user-server-resource" />
                    </bean>
                </entry>
            </map>
            </property>
        </bean>
    </property>
</bean>

重要的一点是SpringFinder bean,其创建方法用于查找和实例化Spring bean而不是直接引用。