Spring Boot:自动装配错误

时间:2018-01-18 08:50:28

标签: java spring spring-boot autowired

我正在尝试创建一个简单的Spring Boot应用程序,该应用程序将名称作为URL中的参数(例如http://localhost:8080/hello/john)并使用英语或德语问候页面打招呼("你好John"或者#34; Hallo John")。

我在Ubuntu 14.04下使用IntelliJ Idea 2017.3.3。

为此,我创建了一个Spring Intializr项目,以及一个名为GreetingService的接口:

package com.springboot.configuration.service;

import org.springframework.stereotype.Component;

@Component
public interface GreetingService {
    String sayHello(String name);
}

此接口将在两个类中实现,GrretingServiceEnglish和GreetingServiceGerman,如下所示:

package com.springboot.configuration.service;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("english")
public class GreetingServiceEnglish implements GreetingService{

    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

package com.springboot.configuration.service;

import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("german")
public class GreetingServiceGerman implements GreetingService{

    @Override
    public String sayHello(String name) {
        return "Hallo " + name;
    }
}

要选择必须使用哪一个,在application.properties中有一个条目:

spring.profiles.active="english"

在控制器中我进行自动装配:

package com.springboot.configuration.controller;

import com.springboot.configuration.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(path = "/", method = RequestMethod.GET)
public class GreetingController {

    @Autowired
    private GreetingService greetingService;

    @RequestMapping(path = "hello/{name}")
    public String sayHello(@PathVariable(name = "name") String name){

        return greetingService.sayHello(name);
    }
}

申请表是:

package com.springboot.configuration;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProfilesApplication {

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

当我运行应用程序时出现错误:

com.springboot.configuration.controller.GreetingController中的字段greetingService需要一个类型为' com.springboot.configuration.service.GreetingService'的bean。无法找到。

出了什么问题?你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

您的有效个人资料设置不正确 - 您不会在application.properties文件中引用字符串。在这种情况下,您的活动配置文件实际上是“"英语"”。如果使用以下命令注释组件类,则可以。

@Profile("\"english\"")

您可以在控制台日志中看到它:

2018-01-18 10:43:51.322  INFO 23212 --- [           main] c.s.configuration.ProfilesApplication    : The following profiles are active: "english"

解决方案

只需在spring.profiles.active

中取消引用application.properties即可
spring.profiles.active=english

它将按预期工作。

2018-01-18 10:47:31.155  INFO 890 --- [           main] c.s.configuration.ProfilesApplication    : The following profiles are active: english

关于i18n的一句话

我想这个项目只是测试Spring Boot功能的一个游乐场(比如配置文件等)。如果您有兴趣将应用程序国际化,请使用LocaleChangeInterceptor使用messages_en.properties + messages_de.properties来定义您的翻译并在单个组件中使用它们。你可以在这里找到一个很好的介绍:http://www.baeldung.com/spring-boot-internationalization