【问题标题】:Injecting dependencies to Restlet ServerResource using Spring IoC使用 Spring IoC 将依赖项注入 Restlet ServerResource
【发布时间】:2012-07-16 21:21:57
【问题描述】:

我正在使用 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提供的是string而不是ref),内部userDao为null。
  3. 当 Spring 如上所述实例化 bean 时,内部 userDao 为 null。

此外,在 (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);
    }
}

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

【问题讨论】:

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


    【解决方案1】:

    好的,我做了一些绝望的谷歌搜索,再次找到了 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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多