ssm 返回json配置_摆脱困境:将运行时配置作为JSON返回

ssm 返回json配置

如果需要确定部署到远程服务器的Spring Web应用程序的运行时配置,则需要读取从远程服务器找到的属性文件。 这很麻烦。

幸运的是,有更好的方法。 这篇博客文章描述了我们如何

  1. 启动我们的Web应用程序时,将运行时配置写入日志文件。
  2. 返回运行时配置为JSON。

让我们开始吧。

如果使用Spring Boot,则应使用Spring Boot Actuator 。 它提供了其他功能,可帮助您监视和管理Spring Boot应用程序。

如果您还没有阅读我的博客文章,标题为:《 从沟壑中反弹:将属性值注入到配置Bean中》那么您应该先阅读它,然后再继续阅读此博客文章 。 它提供了有助于您理解此博客文章的其他信息。

将运行时配置写入日志文件

通过执行以下步骤,我们可以将运行时配置写入日志文件:

  1. toString()方法添加到WebProperties类。
  2. toString()方法添加到ApplicationProperties类。
  3. 启动我们的Web应用程序时,将运行时配置写入日志文件。

让我们找出如何完成这些步骤。

首先 ,我们必须在WebProperties类中添加toString()方法,并使用ToStringBuilder类实现此方法。

完成此操作后, WebProperties类的源代码如下所示:

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public final class WebProperties {

    private final String protocol;

    private final String serverHost;

    private final int serverPort;

    @Autowired
    public WebProperties(@Value("${app.server.protocol}") String protocol,
                         @Value("${app.server.host}") String serverHost,
                         @Value("${app.server.port}") int serverPort) {
        checkThatProtocolIsValid(protocol);

        this.protocol = protocol;
        this.serverHost = serverHost;
        this.serverPort = serverPort;
    }

    private void checkThatProtocolIsValid(String protocol) {
        if (!protocol.equalsIgnoreCase("http") && !protocol.equalsIgnoreCase("https")) {
            throw new IllegalArgumentException(String.format(
                    "Protocol: %s is not allowed. Allowed protocols are: http and https.",
                    protocol
            ));
        }
    }

    public String getProtocol() {
        return protocol;
    }

    public String getServerHost() {
        return serverHost;
    }

    public int getServerPort() {
        return serverPort;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("protocol", this.protocol)
                .append("serverHost", this.serverHost)
                .append("serverPort", this.serverPort)
                .toString();
    }
}

其次 ,我们必须将toString()方法添加到ApplicationProperties类并使用ToStringBuilder类实现它。

在对ApplicationProperties类进行了这些更改之后,其源代码如下所示:

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public final class ApplicationProperties {

    private final String name;

    private final boolean productionModeEnabled;

    private final WebProperties webProperties;

    @Autowired
    public ApplicationProperties(@Value("${app.name}") String name,
                                 @Value("${app.production.mode.enabled:false}") boolean productionModeEnabled,
                                 WebProperties webProperties) {
        this.name = name;
        this.productionModeEnabled = productionModeEnabled;
        this.webProperties = webProperties;
    }

    public String getName() {
        return name;
    }

    public boolean isProductionModeEnabled() {
        return productionModeEnabled;
    }

    public WebProperties getWebProperties() {
        return webProperties;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("name", this.name)
                .append("productionModeEnabled", this.productionModeEnabled)
                .append("webProperties", this.webProperties)
                .toString();
    }
}

第三 ,启动应用程序时,我们必须将运行时配置写入日志文件。 我们可以按照以下步骤进行操作:

  1. 静态的最终Logger字段添加到ApplicationProperties类,并使用LoggerFactory类创建一个新的Logger对象。
  2. writeConfigurationToLog()方法添加到ApplicationProperties类,并使用@PostConstruct注释对其进行注释。 这样可以确保在将创建的bean对象的依赖项注入到该方法之后调用该方法。
  3. 通过将配置写入日志文件来实现writeConfigurationToLog()方法。

在对ApplicationProperties类进行了这些更改之后,其源代码如下所示:

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public final class ApplicationProperties {

    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationProperties.class);

    private final String name;

    private final boolean productionModeEnabled;

    private final WebProperties webProperties;

    @Autowired
    public ApplicationProperties(@Value("${app.name}") String name,
                                 @Value("${app.production.mode.enabled:false}") boolean productionModeEnabled,
                                 WebProperties webProperties) {
        this.name = name;
        this.productionModeEnabled = productionModeEnabled;
        this.webProperties = webProperties;
    }

    public String getName() {
        return name;
    }

    public boolean isProductionModeEnabled() {
        return productionModeEnabled;
    }

    public WebProperties getWebProperties() {
        return webProperties;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("name", this.name)
                .append("productionModeEnabled", this.productionModeEnabled)
                .append("webProperties", this.webProperties)
                .toString();
    }

    @PostConstruct
    public void writeConfigurationToLog() {
        LOGGER.info("Starting application by using configuration: {}", this);
    }
}

启动Web应用程序时,我们应该从其日志文件中找到以下信息:

INFO  - ApplicationProperties      - Starting application by using configuration:
net.petrikainulainen.spring.trenches.config.ApplicationProperties@254449bb[
	name=Configuration Properties example,
	productionModeEnabled=false,
	webProperties=net.petrikainulainen.spring.trenches.config.WebProperties@4e642ee1[
		protocol=http,
		serverHost=localhost,
		serverPort=8080
	]
]

该信息写在一行中,但是我对它进行了格式化,因为我想使其更易于阅读。

将敏感信息(例如数据库用户的用户名或数据库用户的密码)写入日志文件不是一个好主意。

现在,我们可以从其日志文件中找到Web应用程序的运行时配置。 这是对当前情况的改进,但是只有当我们已经在读取日志文件时,它才能使我们的生活更轻松。

让我们找出如何通过实现将运行时配置返回为JSON的控制器方法来使生活更加轻松的方法。

将运行时配置作为JSON返回

通过执行以下步骤,我们可以实现一种控制器方法,该方法将运行时配置作为JSON返回:

  1. 创建一个控制器类,并使用@RestController注释对其进行注释。
  2. 通过使用构造函数注入,将ApplicationProperties bean注入到创建的控制器bean中。
  3. 创建一个控制器方法来处理发送到url'/ config'的GET请求,并通过返回ApplicationProperties对象来实现它。

PropertiesController类的源代码如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
final class PropertiesController {

    private final ApplicationProperties applicationProperties;

    @Autowired
    PropertiesController(ApplicationProperties applicationProperties) {
        this.applicationProperties = applicationProperties;
    }

    @RequestMapping(value = "/config", method = RequestMethod.GET)
    ApplicationProperties getAppConfiguration() {
        return applicationProperties;
    }
}

当我们将GET请求发送到url'/ config'时,我们的控制器方法将返回以下JSON:

{
	"name":"Configuration Properties example",
	"productionModeEnabled":false,
	"webProperties":{
		"protocol":"http",
		"serverHost":"localhost",
		"serverPort":8080
	}
}

我们不应该允许所有人访问我们应用程序的配置。 如果这将是一个真实的应用程序,我们应确保只有管理员才能访问此信息。

让我们继续并总结从这篇博客文章中学到的知识。

摘要

这篇博客文章告诉我们:

  • 我们可以通过重写配置bean类的toString()方法并将这些bean的属性值注入到日志文件中后,将运行时配置写入日志文件。
  • 通过创建返回“根”配置bean对象的控制器方法,我们可以将运行时配置作为JSON返回。

翻译自: https://www.javacodegeeks.com/2015/04/spring-from-the-trenches-returning-runtime-configuration-as-json.html

ssm 返回json配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值