1

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のインスタンスを返すことに注意してください。

私は以下を試しました:

  1. SpringコンテキストからgetBeanを使用してrestlet-user-server-resourceBeanが直接必要な場合、内部userDaoはnullです。
  2. RestletがUserServerResourceクラスを直接インスタンス化する場合(つまり、SpringRouterにrefの代わりにstringが提供されます)、内部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);
    }
}

できるだけ多くの情報を提供したいと思います。アドバイスありがとうございます!

4

1 に答える 1

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>

重要な点は、直接参照の代わりにSpringBeanを検索およびインスタンス化するために使用されるcreateメソッドを備えたSpringFinderBeanです。

于 2012-07-18T11:34:14.060 に答える