Spring Boot根据请求映射获取应用程序属性

时间:2018-08-24 12:39:53

标签: java json spring-boot get request-mapping

我尝试根据请求从我的应用程序属性中获取一些参数。

我的ApplicationConfig类:

@Configuration
@ConfigurationProperties("org.a.b")
public class ApplicationConfig implements Serializable {

    private String name;
    private String ip;
// GETTER AND SETTER

我的application.properties:

org.a.b.name=huhu
org.a.b.ip=x.x.x.x

我尝试其他可能性:

@RestController
public class HelloController

第一:

@Autowired
private ApplicationConfig applicationConfig;

@ResponseBody
@GetMapping(value = "/", produces = "application/json")
public ApplicationConfig index() {
    return applicationConfig;
}

例外:

{"timestamp":"2018-08-24T12:28:50.623+0000","status":500,"error":"Internal Server Error","message":"Type definition error: [simple type, class org.springframework.context.expression.StandardBeanExpressionResolver]; nested exception is com.fasterxml.jackson.datab
ind.exc.InvalidDefinitionException: No serializer found for class org.springframework.context.expression.StandardBeanExpressionResolver and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (
through reference chain: hello.bootstrap.ApplicationConfig$$EnhancerBySpringCGLIB$$31a0e3d2[\"$$beanFactory\"]->org.springframework.beans.factory.support.DefaultListableBeanFactory[\"beanExpressionResolver\"])","path":"/"}

第二:

@ResponseBody
@GetMapping(value = "/", produces = "application/json")
public ApplicationConfig index() {
    return new ApplicationConfig();
}
// return nothing {"name": null, "ip": null}

第三:

@ResponseBody
@GetMapping(value = "/", produces = "application/json")
public String index() {
    return applicationConfig.getIp();
}
// return x.x.x.x

我的pom.xml:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>


    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>hello.ConfigServiceApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>

我希望将Application属性作为对象,例如:

{"name": "dev", "ip": "x.x.x.x"}

2 个答案:

答案 0 :(得分:1)

您第一次尝试就走对了,发现的问题是,当Spring接管像这样的对象的管理时-从配置文件中设置值-它不使用它的“正常”实例,但是代理版本。

网上有很多关于代理工作原理的详细信息,我在这里不做解释(主要是因为就我而言,这很神奇)。

对于您而言,最简单的选择可能是将带有@Configuration批注的类转换为简单的POJO。大多数情况下,可能只是这样:

public class ApplicationConfigResponse {
    private final String name;
    private final String ip;

    public ApplicationConfigResponse(ApplicationConfig applicationConfig) {
        this.name = applicationConfig.getName();
        this.ip = applicationConfig.getIp();
    }

    public String getName() {
        return name;
    }

    public String getIp() {
        return ip;
    }
}

然后,您可以像第一个示例一样从控制器返回该POJO:

@Autowired
private ApplicationConfig applicationConfig;

@ResponseBody
@GetMapping(value = "/", produces = "application/json")
public ApplicationConfigResponse index() {
    return new ApplicationConfigResponse(applicationConfig);
}

如果您希望拥有更多的属性,或者希望将其用作在较大的应用程序中重复使用的模式,则可能更希望查看Spring的内置功能以在对象之间进行转换-本教程是一个不错的起点: https://www.baeldung.com/spring-type-conversions

答案 1 :(得分:0)

不建议用@Configuration@ConfigurationProperties注释类,因为spring以特殊方式用@Configuration对待任何事物。

使用第一种方法,不要用ApplicationConfig注释@Configuration。您的第一种方法应该可行。