2017-10-15 57 views
1

我實現了基於Spring的一點服務。我想在DemoController中自動調用Demo類。因此我在beans.xml文件中定義了它的值。看起來Spring發現了這個bean,因爲一切都在編譯。但服務的返回值如下:Autowired類正在返回空值

{ 「valueUno」:0, 「valueDue」:空}

DemoApplication:

@SpringBootApplication 
@ComponentScan({"com"}) 
@EnableAutoConfiguration 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 

    } 
} 

演示:

@Component 
public class Demo { 

    private int valueUno; 
    private String valueDue; 
    //getter, setter.... 
} 

DemoController:

@RestController 
public class DemoController { 

    @Autowired 
    private Demo demo; 

    @RequestMapping(
      value = "/welcome", 
      method = RequestMethod.GET 
      ) 
    public HttpEntity<Demo> getMessage() { 
     return new HttpEntity<Demo>(this.demo); 
    } 

} 

beans.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" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 
    <bean id="demo" class="com.example.demo.Demo"> 
     <property name="valueUno" value="50"></property> 
     <property name="valueDue" value="Hello"></property> 
    </bean> 
</beans> 

一切是一個封裝的內部。我沒有明白...

+1

那麼你是通過註釋混合XML配置和自動佈線? – rkosegi

回答

4

您已將註釋Demo標註爲@Component。因此,Spring在組件掃描期間使用其默認構造函數實例化此類的bean(您已使用@ComponentScan({"com"})啓用它),然後將其注入(自動裝入)到DemoController。所以,自動佈線的豆不是beans.xml中定義的那個。

有2種方法來解決這個問題:

1)如果你想要去的XML配置,從Demo類中刪除@Component,並添加註釋@ImportResource("classpath:beans.xml")到控制器類。

2)如果你想要去JavaConfig(註釋),你將需要添加單獨的類是這樣的:

@Configuration 
public class MyConfiguration { 
    @Bean 
    public Demo demo() { 
     return new Demo(50, "Hello"); // or initialize using setters 
    } 
} 

...並添加註釋@Import(MyConfiguration.class)到控制器類,以及刪除@ComponentDemo類。

+0

因此,解決的辦法是溝渠xml聲明並創建一個沒有參數的構造函數來將字段設置爲他想要使用的默認值 –

+0

爲答案添加了可能的解決方案:) – PresentProgrammer

2

作爲解決什麼@PresentProgrammer說,你可以將你的XML配置到Java配置如下:

@Bean 
    public Demo demo() { 
     Demo demo = new Demo(); 
     demo.setValueUno(50); 
     demo.setValueDue("Hello"); 
     return demo; 
    } 

您可以將此配置直接添加到DemoApplication類或一個配置類:

@Configuration 
public class BeanConfiguration { 

    //Bean Configurations 

} 

有關更多詳細信息,請參閱Java-based container configuration Spring文檔。

+0

好吧,我明白了。但是如果我想使用xml文件來定義值呢?好像春天無法找到該文件。 – Stev