摆脱困境:将运行时配置作为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;@Autowiredpublic 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;}@Overridepublic 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;@Autowiredpublic 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;}@Overridepublic 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;@Autowiredpublic 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;}@Overridepublic String toString() {return new ToStringBuilder(this).append("name", this.name).append("productionModeEnabled", this.productionModeEnabled).append("webProperties", this.webProperties).toString();}@PostConstructpublic 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;@AutowiredPropertiesController(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返回。
  • PS:您可以从Github获得此博客文章的示例应用程序 。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫依赖的架包

网络爬虫依赖的架包 commons-codec-1.3.jarcommons-httpclient-3.1.jarcommons-logging-1.0.4.jarhtmllexer.jarhtmlparser.jar 转载于:https://www.cnblogs.com/aicpcode/p/4194898.html

调用布尔变量java_关于java的参数的调用,还有布尔的理解,这有一段代码,我有些不太理解,希望能够帮我分析下,谢谢...

第一段代码public class CustomerBiz {String[] namesnew String[30]; //创建学生姓名数组//实现姓名的添加public void addName(String name){for(int i0;iif(names[i]null){names[i]name;break;}}}public void showName(){ //显示姓名for(int i0;iif(names[i]!null){System.o…

优化哈希策略的简介

总览 用于哈希键的策略可以直接影响哈希集合(例如HashMap或HashSet)的性能。 内置的哈希函数被设计为通用的,并且可以在各种用例中很好地工作。 我们可以做得更好,特别是如果您对用例有一个很好的了解吗? 测试哈希策…

java中报错convension_LambdaConversionException与泛型:JVM错误?

此错误不是完全固定的。我只是LambdaConversionException在1.8.0_72中遇到了一个问题,发现Oracle的错误跟踪系统中有未解决的错误报告: link1,link2。(编辑:据报告,链接的错误已在JDK 9 b93中关闭)作为一种简单的解决方…

java初学者指南_Java初学者指南

java初学者指南Java编程的第一步。 对于Java中的入门教程,请参阅Sun的官方帮助这里 除了核心语言外,还有几种技术和API 介绍。 我们建议首先阅读涵盖 基础知识,并继续其余的教程。 我们建议: 保持代码简单明了且易于阅读 拆…

Java面试题2019简书_2019最新Spring面试题大全含答案之Spring Beans(2019最全Spring超级葵花宝典)...

1.什么是Spring beans?Spring beans 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中 的形式定义。Spring 框架定义的beans都是单件bean…

javascript练习----复选框全选,全不选,反选

第一种方式&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style>body{color: #000}</style> <script> document.write("<ul>&quo…

使用此首选项可加快Eclipse m2e配置

谁不认识他们。 Eclipse中的旧式JFace对话框可以使您直观地看到实际上是一个相当简单的XML或属性文件。 对于m2e&#xff0c;它看起来像这样&#xff1a; 不幸的是&#xff0c;此屏幕的加载速度有点慢&#xff0c;除了检查版本号和您将永远不会更改的其他内容之外&#xff0c…

php 判断两个数组差集,php array_udiff_assoc 计算两个数组的差集实例

php array_udiff() 函数用于比较两个(或更多个)数组的键名和键值&#xff0c;并返回差集。此比较是通过用户提供的回调函数来进行的。如果认为第一个参数小于&#xff0c;等于&#xff0c;或大于第二个参数时必须分别返回一个小于零&#xff0c;等于零&#xff0c;或大于零的整…

【百度地图API】发布静态图API啦!只需一个网址,即可展示定制百度地图!

【百度地图API】发布静态图API啦&#xff01;只需一个网址&#xff0c;即可展示定制百度地图&#xff01; 原文:【百度地图API】发布静态图API啦&#xff01;只需一个网址&#xff0c;即可展示定制百度地图&#xff01;摘要&#xff1a; 百度地图静态图API&#xff01;您无须执…

脚本在流程中的性能影响

我们经常看到人们出于各种目的而使用脚本&#xff08;例如&#xff0c;在服务任务&#xff0c;执行侦听器等中&#xff09;。 使用脚本和Java逻辑通常很有意义&#xff1a; 它不需要打包到jar中并放在classpath上 它使流程定义更易于理解&#xff1a;无需查看其他文件 逻辑是…

php 弹出变量,php取变量出现Notice: Undefined variable 的解决方法

Notice: Undefined variable: email in D:\PHP5\ENOTE\ADDNOTE.PHP on line 9Notice: Undefined variable: subject in D:\PHP5\ENOTE\ADDNOTE.PHP on line 9Notice: Undefined variable: comment in D:\PHP5\ENOTE\ADDNOTE.PHP on line 9........本来php是不需要定义变量的&am…

PowerDesigner使用教程

原文&#xff1a;http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html PowerDesigner是一款功能非常强大的建模工具软件&#xff0c;足以与Rose比肩&#xff0c;同样是当今最著名的建模软件之一。Rose是专攻UML对象模型的建模工具&#xff0c;之后才向数据库建模…

mac os java_适用于Mac OS X的官方Java 7 –状态

mac os java希望到目前为止&#xff0c;每个人都知道苹果公司去年加入了OpenJDK项目。 那是什么意思&#xff1f; 苹果将​​把用于私有Mac Java构建的代码作为GPL代码贡献给OpenJDK Oracle将接管Java的Mac端口 随着时间的流逝&#xff0c;Mac平台将成为Java世界中完全一流的…

php 鼠标点击图片放大,鼠标移入放大图片预览效果实现

商城项目中&#xff0c;有鼠标移入图片放大的功能&#xff0c;研究一下实现Image zoombody {display: flex;justify-content: center;align-items: center;min-height: 100vh;}#image {width: 300px;height: 300px;background-color: #000;background-image: url(https://place…

红帽峰会2015所需的JBoss BPM内容指南

明年再见&#xff1f; 今年在Red Hat Summit上&#xff0c;我们在JBoss BRMS和JBoss BPM Suite演讲中获得了很多乐趣。 在DevNation周围也有一些社区会议&#xff0c;重点介绍了使我们的产品成为可能的项目。 您可以在他们的博客上找到此演讲的概述&#xff0c;并在其中提供…

设计模式 之 享元

享元模式&#xff08;Flyweight&#xff09; 运用共享技术有效地支持大量细粒度的对象。 还记得那年夏天一起在作文本上玩过的五子棋吗&#xff1f;五子棋是一种两人对弈的纯策略型棋类游戏&#xff0c;它起源于中国古代的传统黑白棋种之中的一个&#xff0c;不…

php制作简单的用户登陆,如何用php代码实现简单的用户登陆以及登陆验证功能

本文主要简单讲述了如何使用php实现简单的用户登陆以及登陆验证效果。1、首先实现通过Session实现用户的登录那么什么是session呢&#xff1f;session被译为会话&#xff0c;它主要是为了在一定访问期间在不同页面之间间传输数据&#xff0c;用来解决http协议无状态。session在…

纪事日记–可自定义的数据存储

总览 使任何数据结构或算法尽可能快的方法是使代码完全执行您想要的操作&#xff0c;而无需执行其他操作。 建立一个可以做任何人想做的每件事的数据存储的问题是&#xff0c;它做得不好。 自定义数据存储在性能方面可以实现什么&#xff1f; 您可以支持&#xff1b; 大约75纳…

php vprintf,vprintf - [ C语言中文开发手册 ] - 在线原生手册 - php中文网

格式-指向以空字符结尾的字符串的指针&#xff0c;指定如何解释数据。格式字符串由普通的多字节字符(&#xff05;除外)组成&#xff0c;它们被原样复制到输出流和转换规范中。每个转换规范具有以下格式&#xff1a;介绍&#xff05;字符(可选)一个或多个标志&#xff0c;用于修…