2011-11-14 37 views
2

我花了數小時試圖弄清楚爲什麼我的代碼會引發以下異常。在這一點上,我希望有人可以更聰明比我,因爲我失去希望......;)彈簧測試的自動佈線問題

造成的:org.springframework.beans.factory.NoSuchBeanDefinitionException:類沒有匹配豆[com.ls.forecast.jpa.ForecastElementService]找到依賴關係:預計至少有1個bean有資格作爲此依賴關係的自動連線候選。依賴註釋:org.springframework.beans {@ org.springframework.beans.factory.annotation.Autowired(required = true),@ org.springframework.beans.factory.annotation.Quali fier(value = main)} 。 factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:924) 在org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:793) 在org.springframework.beans.factory.support.DefaultListableBeanFactory。 resolveDependency(DefaultListableBeanFactory.java:707) 在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)

我看了很多主題/教程沒有運氣。他們似乎都和我的一樣。我在服務的實現上添加了@Service,我添加了一個Qualifier,檢查了ForecastElementServiceImpl實際實現了接口ForecastElementService。

服務接口:

public interface ForecastElementService { 

Collection<ForecastElement> retrieve(String date); 
Collection<ForecastElement> retrieve(); 
} 

接口實現:

@Stateless 
@TransactionAttribute(TransactionAttributeType.REQUIRED) 
@Repository("forecastElementService") 
@Service 
public class ForecastElementServiceImpl implements ForecastElementService { 

@PersistenceContext 
protected EntityManager em; 

@Override 
@Cacheable("forecastElements") 
public Collection<ForecastElement> retrieve(String date) { 
    String sql = null; 
    if(date != null) { 
     sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType WHERE ?1 between fe.startDate and fe.endDate"; 
    } else { 
     sql = " SELECT fe FROM ForecastElement fe JOIN FETCH fe.forecastType"; 
    } 
    final TypedQuery<ForecastElement> query = em.createQuery(sql, ForecastElement.class); 

    return query.getResultList(); 
} 

@Override 
@Cacheable("forecastElements") 
public Collection<ForecastElement> retrieve() { 

    return retrieve(null); 
} 

}

的context.xml:

<bean id="forecastElementService" class="com.ls.forecast.jpa.ForecastElementServiceImpl"> 
<property name="entityManagerFactory" ref="entityManagerFactory"/> 

最後是故障測試類 - forecastElementService變量是拋出異常的那個變量。

@Repository 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({"*-context.xml"}) 
public class ModelJpaTest extends AbstractTransactionalJUnit4SpringContextTests { 

//final Logger logger = LoggerFactory.getLogger(ModelJpaTest.class); 

@Autowired 
protected ForecastElementService forecastElementService; 

@Autowired 
@Qualifier("basicDataSource") 
@Override 
public void setDataSource(DataSource dataSource) { 
    super.setDataSource(dataSource); 
} 

@Test 
public void LoadModelTest() { 
    assertNotNull("forecastElementService is null", forecastElementService); 
    Collection<ForecastElement> elements = forecastElementService.retrieve(); 
    assertTrue(elements.size() > 0); 
} 

} 

任何見識或幫助將非常感激!

見@ContextConfiguration ...如果我放在ModelJpaTest-context.xml中在我的Maven項目和編輯到的資源(測試)文件夾:

@ContextConfiguration({"/ModelJpaTest-context.xml"}) 

真的被弄得現在...

回答

0

至少在實現類中沒有propery的「entityManagerFactory」。不確定這是否可能已經導致問題。 您可以共享完整的堆棧跟蹤(包括嵌套異常)以及一些* context.xml文件的更多片段嗎?

編輯:看一看這個答案:Testing against Java EE 6 API

+0

這裏是整個context.xml文件: – user899757

+0

它不會讓我發佈整個xml,我不能在接下來的8個小時發佈答案......我把它拿出來了。感謝您指出,但我仍然得到同樣的錯誤。實際上,我現在決定指向我的c:驅動器上的上下文文件,現在我得到一個不同的錯誤信息 - 請參閱對Jhakki的回覆。 – user899757

0

我會建議使用兩種或@Repository @Service - 但不能兩者都 - 您的服務實現類。

您可能遇到與未觸發事務相關的另一個問題 - 此處:https://jira.springsource.org/browse/SPR-5082 - 解決方法是在應用程序上下文xml定義文件中定義bean。

+0

將@ContextConfiguration設置爲可以從C:驅動器加載上下文文件之後,我現在得到以下異常:類方法中非本地或抽象的方法中的缺少代碼屬性javax/ejb/TransactionAttributeType' – user899757

+0

It won 「讓我看後由於某種原因,整個POM,但這裏有兩個在這裏打球:'公地DBCP 公地DBCP 1.4 的javax 的JavaEE的API ' – user899757

+0

缺少代碼...意味着,你有api,但是你缺少一個jee實現。你想爲你的應用程序使用哪個應用程序服務器?對於jboss,它是例如的依賴性: org.jboss.spec 的jboss-的JavaEE-6.0 1.0.0.Final POM 提供 Wintermute

1

我需要將註釋配置和組件掃描添加到applicationContext.xml中,以便它能正確「自動裝載」該bean。一旦完成,我就可以擺脫測試類中的變量(forecastElementService)。