Spring / Hibernate / Restlet / Jettyを使用してRESTサービスを構築していますが、単純なタスクだと思っていたものに苦労しています。
DAO実装(つまりUserDao)をServerResource(この場合はUserServerResource)に注入する必要があります。
SpringRouter Beanを使用して、SpringXML構成でこのリソースへのルーティングを確立しています。
<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-resourceBeanが直接必要な場合、内部userDaoはnullです。
- RestletがUserServerResourceクラスを直接インスタンス化する場合(つまり、SpringRouterにrefの代わりにstringが提供されます)、内部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);
}
}
できるだけ多くの情報を提供したいと思います。アドバイスありがとうございます!