1

我建立與Spring /休眠/的Restlet /碼頭REST服務,我什麼我認爲是一個簡單的任務掙扎:注入依賴到的Restlet ServerResource使用Spring IoC

我需要注入DAO實現(即UserDao)到ServerResource(本例中爲UserServerResource)。

我使用SpringRouter豆建立路由到該資源在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(「用戶道」)按預期工作,並返回userDAO的充分準備實例。

我嘗試以下操作:

  1. 當使用的getBean從Spring上下文直接需要的Restlet用戶的服務器資源豆,內部userDAO的爲空。
  2. 當Restlet直接實例化UserServerResource類(所以,爲SpringRouter提供字符串而不是ref)時,內部userDao爲null。
  3. 當Spring如上所述實例化bean時,internal 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("[email protected]"); 
     return (user); 
    } 

    public void setUserDao(UserDao dao) 
    { 
     this.userDao = dao; 
    } 

    public UserDao getUserDao() 
    { 
     return (this.userDao); 
    } 
} 

我希望我儘可能多的信息儘可能提供。 謝謝你的任何建議!

回答

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豆與創建用於查找和實例化的Spring bean,而不是直接的參考方法。