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;@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

ssm 返回json配置

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

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

相关文章

为什么 Android 必须在主线程更新 UI ?

点击蓝字关注我们为什么Android必须在主线程更新UI?站在各位大牛的肩膀上,谢谢!正常情况下,Android需要在UI线程更新UI,然鹅,在特殊情况下,子线程也能更新UI不在讨论之列,这篇文章主…

如何对linux文件进行编译,Linux下将源文件编译成目标文件的过程解析

简介请讲一下linux如何源文件逐步编译成可执行文件。解答首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程。以hello.c 程序为例# include main{printf("hello\n");}一个.c源程序需要经过预处理器生成.i文件,再经过编译器生成…

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

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

学点 STL C++ 的线性容器

点击蓝字关注我们std::array看到这个容器的时候肯定会出现这样的问题:为什么要引入 std::array 而不是直接使用 std::vector?已经有了传统数组,为什么要用 std::array?先回答第一个问题,与 std::vector 不同,std::arr…

linux at查看进程命令,at命令 - Linux命令大全 | linux教程

at命令允许指定运行脚本时间,at的守护进程atd会以后台模式运行,检查系统上的一个特殊目录来获取at命令的提交的作业。默认情况下,atd守护进程每60秒检查一次目录。有作业时会检查作业运行时间,如果与当前时间匹配,则运…

java替换数组中的元素_如何使用Java 8流快速替换列表中的元素

java替换数组中的元素假设您有一个项目清单&#xff1a; List<String> books Arrays.asList("The Holy Cow: The Bovine Testament","True Hip Hop","Truth and Existence","The Big Book of Green Design" );&#xff08;不要…

C++:良好的编程习惯与编程要点

点击蓝字关注我们以良好的方式编写C class假设现在我们要实现一个复数类complex&#xff0c;在类的实现过程中探索良好的编程习惯。① Header(头文件)中的防卫式声明complex.h: # ifndef __COMPLEX__ # define __COMPLEX__ class complex {} # endif防止头文件的内容被多次包含…

如何使用man命令linux,Linux man命令的使用方法

Linux提供了丰富的帮助手册&#xff0c;当你需要查看某个命令的参数时不必到处上网查找&#xff0c;只要man一下即可。可以使用man man 查看man的使用方法1.man共有以下几个章节代码功能1标准用户命令(Executable programs or shell commands)2系统调用(System calls)functions…

linux adb 端口,linux 无法连接adb 设备

之前电脑linux 连接 adb 设备一直都是正常的&#xff0c;今天突然出现无法连接的情况adb shell出现下面的错误信息error: insufficient permissions for deviceadb device出现下面的信息List of devices attached????????????no permissions解决方法lsusb 查看adb…

php 系统交互 删除文件_FileSystemMap:与文件系统交互的自然方法

php 系统交互 删除文件作为项目的一部分&#xff0c;我目前正在研究创建FileSystemMap 。 我已经开始了一个非常小的GitHub的项目在这里举办的代码。 本质上&#xff0c;此映射实现将允许用户与其文件系统上的目录进行交互&#xff0c;就好像它是java.util.Map 。 映射中的每个…

又要卷?挑战 C 语言,新的系统编程语言 Hare 发布

点击蓝字关注我们开发者 Drew DeVault 公布了一门新的系统编程语言 Hare &#xff08;野兔&#xff09;。Hare 的开发时间接近两年半&#xff0c;它使用静态类型系统、手动内存管理和最小运行时&#xff0c;非常适合编写操作系统、系统工具、编译器以及其他低级高性能任务。据 …

java cuba_CUBA平台–新的Java企业应用程序框架

java cuba所以..你好&#xff0c;世界&#xff01; 我们的英语网站终于可以正常使用了&#xff0c;现在每个人都可以下载该平台&#xff0c;并可以以前所未有的速度更快地创建业务应用程序。 在我们决定与国际Java社区共享足够好之前&#xff0c;我们花了六年的永久发展和偶尔的…

linux设备驱动开发详解源码,linux设备驱动开发详解光盘源码.rar

压缩包 : linux设备驱动开发详解光盘源码.rar 列表19/busybox源代码/busybox-1.2.1.tar.bz219/MTD工具/mtd-utils-1.0.0.tar.gz19/nand驱动范例/s3c2410.c19/nor驱动范例/s3c2410nor.c19/yaffs&yaffs2源代码/yaffs.tar.gz19/yaffs&yaffs2源代码/yaffs2.tar.gz20/USB串口…

进程、线程、协程三个概念傻傻分不清

点击蓝字关注我们进程&#xff0c;是并发执行的程序在执行过程中分配和管理资源的基本单位&#xff0c;每一个进程都有一个自己的地址空间&#xff0c;即进程空间或&#xff08;虚空间&#xff09;。进程空间的大小 只与处理机的位数有关&#xff0c;一个 16 位长处理机的进程空…

随机数发生器怎么用_用随机数发生器射击自己的脚

随机数发生器怎么用这将不是解释随机数生成器毕竟不是那么随机的文章之一。 因此&#xff0c;您中的那些人希望获得有关如何破解老虎机&#xff0c;继续前进的指南&#xff0c;在这里什么也看不到。 相反&#xff0c;它是有关一个不太常见的锁争用问题的帖子&#xff0c;该问题…

linux 4.14.2编译,vmware中linux内核2.6.14.4编译全过程_linux教程

很久就开始尝试编译Linux内核&#xff0c;但是总是遇到不少的问题&#xff0c;经过几十次的编译&#xff0c;直到现在才解决&#xff0c;人都要崩溃了。所以干脆把这个过程写出来&#xff0c;希望在你遇到同样问题的时候少走点弯路。我用的是Red Hat Linux 9. 内核版本是2.6.14…

C++ STL deque 容器底层实现原理(深度剖析)

点击蓝字关注我们什么是多态&#xff0c;多态有什么用途&#xff1f;定义&#xff1a;“一个接口&#xff0c;多种方法”&#xff0c;程序在运行时才决定调用的函数。实现&#xff1a;C多态性主要是通过虚函数实现的&#xff0c;虚函数允许子类重写override(注意和overload的区…

lambda ::_Lambdas中的例外:有点混乱的优雅解决方案

lambda ::考虑以下用于写入文件的功能&#xff1a; 该方法背后的想法是&#xff0c;以允许用户在不同的实施方式中通过InputStream的方法&#xff0c;以便writeToFile可以被称为例如用GZIPOuputStream &#xff0c; SnappyOuputStream &#xff08;快速压缩&#xff09;或简单…

​常问的16个C语言问题,你能答上来几个?

点击蓝字关注我们最近不少小伙伴在找工作&#xff0c;这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题&#xff0c;你看看能答上来几个呢&#xff1f;1用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09;#de…

centos linux 内核升级,Centos系统的升级及Linux 内核升级

系统及内核版本&#xff1a;[rootnode5 ~]# cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core)[rootnode5 ~]# uname -aLinux node6 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux更新仓库&#xff1a;[rootnode5 yu…