2017-03-16 21 views
0

私は問題に直面しました。そして私は同じトピックをたくさん研究しましたが、私は問題を解決できません。 私はSpringBootアプリケーションを持っています。 RestControllerクラスを開発したいと思います。@RestControllerでフィールドをオートワイヤできませんでした

@SuppressWarnings("unchecked") 
public class AchievementManager { 

private final Class thisClass = Achievement.class; 
private BaseDAO dao; 

public AchievementManager(BaseDAO dao) { 
    this.dao = dao; 
} 

public Achievement getAchievementById(Long id) { 
    return (Achievement) dao.getItem(thisClass, id); 
} 

public Achievement createAchievementAndReturn(Achievement achievement) { 
    dao.createItem(achievement); 
    return getAchievementById(achievement.getId()); 
} 

public Achievement saveChangesAndReturn(Long id, Achievement achievement) { 
    return dao.updateItem(thisClass, id, achievement); 
} 
} 

春のXMLはここにある:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

<bean name="manager" class="com.rpglife.data.managers.AchievementManager" > 
    <constructor-arg name="dao" ref="dao"/> 
</bean> 

<bean name="dao" class="com.rpglife.data.BaseDAO" > 
    <constructor-arg name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="configLocation" value="hibernate.cfg.xml"/> 
</bean> 

<context:component-scan base-package="com.rpglife.data"/> 

</beans> 

@RequestMapping("achievement/") 
@RestController 
public class AchievementController { 

@Autowired 
private AchievementManager manager; 

@RequestMapping(value = "{id}", method = RequestMethod.GET) 
public Achievement showAchievement(@PathVariable("id") Long id) throws DBException { 
    return manager.getAchievementById(id); 
} 

@RequestMapping(value = "/", consumes = "application/json", method = RequestMethod.POST) 
public Achievement createAchievement(@RequestBody Achievement achievement) throws DBException { 
    return manager.createAchievementAndReturn(achievement); 
} 

@RequestMapping(value = "{id}", consumes = "application/json", method = RequestMethod.PUT) 
public Achievement changeAchievement(@PathVariable("id") Long id, @RequestBody Achievement achievement) throws DBException { 
    return manager.saveChangesAndReturn(id, achievement); 
} 
} 

そして私は@Autowireマネージャフィールド

Exception encountered during context initialization - cancelling 
refresh attempt:org.springframework.beans.factory. 
BeanCreationException: 
Error creating bean with name 'achievementController': Injection of 
autowired dependencies failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private 
com.rpglife.data.managers.AchievementManager 
com.rpglife.controller.AchievementController.manager; nested exception 
is org.springframework.beans.factory.NoSuchBeanDefinitionException: No 
qualifying bean of type [com.rpglife.data.managers.AchievementManager] 
found for dependency: expected at least 1 bean which qualifies as  
autowire candidate for this dependency. Dependency annotations: { 
@org.springframework.beans.factory.annotation.Autowired(required=true)} 
. 
. 
. 
Caused by: org.springframework.beans.factory. 
NoSuchBeanDefinitionException: No qualifying bean of type 
[com.rpglife.data.managers.AchievementManager] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this 
dependency. Dependency annotations:{ 
@org.springframework.beans.factory.annotation.Autowired(required=true)} 

マイAchievmentManagerクラスとのトラブルをしました:そして、それはどのように見えますか

メインクラス:

@SpringBootApplication 
public class Main { 
    public static void main(String[] args) { 
     SpringApplication.run(Main.class, args); 
    } 
} 

そして、ここに私のプロジェクトの構造(必要であれば、私はあまりにもリソースを添付することができます): enter image description here

私が把握しようとした何を:

  1. 私は( "マネージャー" の使用@Qualyfierを試してみました)
  2. @ComponentScan(basePackages = {"com.rpglife"})と @SpringBootApplication(scanBasePackages = {"com.rpglife"})を試してみました(メイン クラスはそのままです) com.rpglife。あなたは私にいくつかの答えとアドバイスを与える場合は、他のパッケージは、私は非常に感謝します ...私が間違って何であるか見当がつかない

)あまりにも、私は必ず これは無用だったここにあります。良い一日を!)

更新: 私はspring.xmlに問題があると思う。うまくいかず、Beanを定義できない場合はどうなりますか?それを確認する方法...

更新: エラーは、私はあなたが春ブーツとXMLベースのアプリケーション・コンテキストを混合している

Exception encountered during context initialization - cancelling 
refresh attempt: 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'achievementController': Injection of autowired 
dependencies failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Could not 
autowire field: private com.rpglife.data.managers.AchievementManager 
com.rpglife.controller.AchievementController.manager; nested exception 
is org.springframework.beans.factory.BeanCreationException: Error 
creating bean with name 'achievementManager' defined in file 
[/Users/eignatik/IdeaProjects/LifeRPG/be/target 
/classes/com/rpglife/data/managers/AchievementManager.class]: 
Instantiation of bean failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to 
instantiate [com.rpglife.data.managers.AchievementManager]: No default 
constructor found; nested exception is java.lang.NoSuchMethodException: 
com.rpglife.data.managers.AchievementManager.<init>() 
+0

を引き続き使用したい、そして、あなたはどのようなパッケージで –

+0

をcom.rpglifeする@ComponentScan org.rpglife変更basepackageにしている場合は、あなたのSpringBootApplicationです(Main.class)? @SpringBootApplicationは、スプリングブートのメインパッケージ(あなたの場合はcom.rpglife)の下にあるすべてのパッケージ/クラスを自動的にスキャンします。それはそれを拾う必要があります。あなたはなぜspring xmlを春の起動アプリケーションで使用していますか?すべてのクラスに '@ Component' /' @Service'を使って注釈を付けるのはなぜですか? – ddewaele

+0

@hichamabdedaime aw、ちょうどタイプミスです、私は今どのようにそれを書いたか) –

答えて

1

@追加したとき。

デフォルトでは、SpringブートはアプリケーションコンテキストXMLファイルをロードしません。

  1. は、XMLを使用して、あなたのクラスのすべてに注釈を付けないでください:あなたは2つの選択肢があり

    (春ブーツは重く非XMLベースのコンテキストを促進します)。 @SpringBootApplicationのパッケージにネストされたすべてのSpringアノテーション付きクラスがスキャンされます。これは、Spring BootをIMHOで使用する方法です。

  2. チェックこのあなたが本当にcom.rpglifeある添付ファイルベースパッケージにXML http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-importing-xml-configuration
+0

はい、ありがとうございます。将来、SpringBootを使用したくありません。ありがとう、私は第二の方法を試してみます... –

+0

私は強くSpring Bootを使用し、XMLをダンプすることを推奨します。特に新しいプロジェクトに。答えが気に入ったら、それを受け入れてください。 – ddewaele

+0

それは動作します、私たちはこのアプローチの問題を修正しました –

関連する問題