【发布时间】: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 实例。
我尝试了以下方法:
- 当直接使用 Spring 上下文中的 getBean 需要 restlet-user-server-resource bean 时,内部 userDao 为 null。
- 当Restlet直接实例化UserServerResource类时(所以SpringRouter提供的是string而不是ref),内部userDao为null。
- 当 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