Spring Boot:如何将@RestController与变量来自属性文件的类一起使用

时间:2017-12-11 17:03:55

标签: rest spring-boot spring-restcontroller spring-config

所以我是Spring的新手,我基本上第一次尝试制作REST服务。我想要返回的一些数据是来自属性文件的一些数据。

这是我的配置bean:

@Configuration
@PropertySource("classpath:client.properties")
public class PropertyConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer 
    propertySourcesPlaceholderConfigurer() {
         return new PropertySourcesPlaceholderConfigurer();
    }
}

这是包含我想从API返回的信息的类。当我将鼠标悬停在值上时,我可以看到该属性正在被注入。

public class ProviderInfo {

    @Value("${op.iss}") private String issuer;
    @Value("${op.jwks_uri}") private String jwksURI;
    @Value("${op.authz_uri}") private String authzURI;
    @Value("${op.token_uri}") private String tokenURI;
    @Value("${op.userinfo_uri}") private String userInfoURI;

    // Getter methods
}

这是RestController

@RestController
public class ProviderInfoController {

    @RequestMapping(value = "/provider-info", method = RequestMethod.GET)
    public ProviderInfo providerInfo() {
        return new ProviderInfo();
    }
}

当我导航到该端点时,一切都为空:

{"issuer":null,"jwksURI":null,"authzURI":null,"tokenURI":null,"userInfoURI":null}

有人能看出我做错了什么吗?或者,如果有更好的方法来实现这一点?

谢谢!

2 个答案:

答案 0 :(得分:3)

@Value注释的处理由Spring完成,因此您需要从Spring获取ProviderInfo实例以实际设置值。

@RestController
public class ProviderInfoController {

    @Autowired
    private ProviderInfo providerInfo;

    @RequestMapping(value = "/provider-info", method = RequestMethod.GET)
    public ProviderInfo providerInfo() {
        return providerInfo;
    }
}

这也要求Spring选择并处理ProviderInfo类。

答案 1 :(得分:0)

此外,您需要使用@Component或@Service将ProviderInfo类添加到Spring Bean生命周期中,如下所示:

@Component
public class ProviderInfo {

    @Value("${op.iss}") private String issuer;
    @Value("${op.jwks_uri}") private String jwksURI;
    @Value("${op.authz_uri}") private String authzURI;
    @Value("${op.token_uri}") private String tokenURI;
    @Value("${op.userinfo_uri}") private String userInfoURI;

    // Getter methods
}

只有这样,您才能在ProviderInfoController类中使用@Autowired。