i18n(Internationalization),即国际化。目的是为了使软件、应用或网站能够适应不同的语言、地区,用户可以选择他们熟悉的语言进行交互,为所有用户提供一致的体验。
本文将会带你了解如何使用 Spring Boot + Freemarker 实现国际化。
假设我们有一个登录页面,其中有 2 个输入框,分别用于输入 用户名 和 密码。对于使用不同语言的用户,需要显示不同的输入框名称。
创建项目 在 pom.xml 中添加 web 和 freemarker stater 依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 配置 定义国际化资源文件 通常我们会把项目中需要国际化的内容定义在不同的 properties 文件中,通过 properties 文件名的后缀来表示资源的 语言 和 国别。
在 resources 目录下创建 i18n 目录,用于存放国际化资源文件。接着,在 i18n 目录中创建如下 3 个 properties 文件,如下:
message.properties
# message.properties 的内容 # 空着就行 message_en_US.properties
# message_en_US.properties 的内容 # 英文 login.username=USERNAME login.password=PASSWORD message_zh_CN.properties
# message_zh_CN.properties 的内容 # 中文 login.
1、概览 本文将带你了解如何在 Spring 应用的 Service 层中使用 Spring Validation 进行校验。
2、应用分层 Spring Web 应用通常分为如下几层:
Consumer 层或 Web 层是 Web 应用程序的最上层。它负责解析用户的输入并提供适当的响应。其他层抛出的异常也必须由 Web 层处理。由于 Web 层是应用程序的入口点,因此它负责身份认证,是防止未授权用户的第一道防线。
在 Web 层之下是 Service 层。它充当事务屏障,同时承载应用和基础设施服务。Service 层的公共 API 由应用服务提供。它们通常作为事务边界,并负责授权事务。基础设施服务提供与外部工具(包括文件系统、数据库和电子邮件服务器)连接的 “管道代码”。这些方法通常被多个应用服务使用。
Web 应用的最底层是持久层。换句话说,它负责与数据存储进行交互。
3、Service 层的验证 Service 层是应用中的一个层,用于在 Controller 和持久层之间进行通信。此外,业务逻辑也存储在 Service 层中。其中特别包括验证逻辑。Model 状态用于 Controller 层和 Service 层之间的通信。
在业务层进行验证逻辑有其优点和缺点。Spring 的验证(和数据绑定)架构并不排除任何一种方式。验证未绑定在 Web 层,这易于本地化,并且允许使用任何可用的 Validator。
此外,客户端输入数据并不总是通过 REST Controller 处理,如果不在 Service 层进行验证,非法数据可能会通过,引发多个问题。
在这种情况下,可以使用标准的 Java JSR-303 验证方案。
4、示例 使用 Spring Boot 开发一个简单的用户注册应用。
4.1、Domain 只有 name、age、phone 和 password 属性:
1、概览 Spring Boot Web 应用默认包含一个预配置的嵌入式 Web 服务器。有时候需要对这个服务器进行一些定制来满足特殊的需求。
本文将会带你了解如何在 Spring Boot 应用中通过 max-http-header-size 配置属性来限制客户端的 Header 大小。
2、Max-HTTP-Header-Size Spring Boot 支持将 Tomcat、Undertow 和 Jetty 作为嵌入式服务器。通常,会在 Spring Boot 应用的 application.properties 文件或 application.yaml 文件中定义服务器配置。
大多数 Web 服务器对 HTTP 请求头有自己的大小限制。HTTP 请求头的值受服务器实现的限制。在 Spring Boot 应用中,可以使用 server.max-http-header-size 配置属性来配置最大允许的 HTTP Header 的大小
Tomcat 和 Jetty 的默认值为 8kB,而 Undertow 的默认值为 1MB。
在 application.properties 文件中添加该属性,修改最大 HTTP Header 大小:
server.max-http-header-size=20000 同样,application.yaml 格式也是如此:
server: max-http-header-size: 20000 从 Spring Boot 2.1 开始,可以使用 DataSize 格式的值:
1、概览 本年将带你了解原生镜像(Native Image)的相关知识,以及如何使用 Spring Boot 和 GraalVM 构建原生镜像应用。
本文使用的是 Spring Boot 3,但是在末尾会教你如何解决与 Spring Boot 2 的差异问题。
2、原生镜像 原生(本地)镜像是一种将 Java 代码构建为独立可执行文件的技术。该可执行文件包括应用程序类、其依赖项的类、运行时库类以及来自 JDK 的静态链接本地代码。JVM 被打包到原生镜像中,因此在目标系统上不需要任何 Java 运行环境,但构建产物依赖于平台。因此,需要为每个支持的目标系统进行一次构建,在使用 Docker 等容器技术时会更加简单,将容器构建为一个目标系统,可以部署到任何 Docker 运行时。
2.1、GraalVM 和 Native Image Builder 通用递归应用和算法语言虚拟机(Graal VM)是一个高性能的 JDK 发行版,专为 Java 和其他 JVM 语言编写,同时支持 JavaScript、Ruby、Python 和其他几种语言。它提供了一个原生镜像生成器(Native Image builder),这是一个从 Java 应用中生成原生代码并将其与 VM 一起打包成独立可执行文件的工具。Spring Boot Maven 和 Gradle Plugin 除了少数 例外情况(Mockito 目前不支持原生测试),正式支持该工具。
2.2、两个特性 在构建原生镜像时,会遇到两个典型特性。
Ahead-Of-Time(AOT)编译是将高级 Java 代码编译成本地可执行代码的过程。通常由 JVM 的即时编译器 (JIT) 在运行时进行编译,这样可以在执行应用程序时进行观察和优化。在 AOT 编译的情况下,这一优势就不复存在了。
通常,在进行 AOT(Ahead-of-Time)编译之前,可以选择进行一个单独的步骤,称为 AOT 处理,即从代码中收集元数据并提供给 AOT 编译器。将这两个步骤分开是有意义的,因为 AOT 处理可以是针对特定框架的,而 AOT 编译器更加通用。下面的图片给出了一个概览:
1、概览 日志是每个应用的重要组成部分。在应用中,可以将日志存储在文件或数据库中。除此以外,还可以将日志数据发送到集中式日志管理应用,如 Graylog 或 Syslog。
本文将带你了解如何在 Spring Boot 应用中使用 Log4j2 将日志信息发送到 Syslog 服务器。
2、Log4j2 Log4j2 是 Log4j 的最新版本。它是高性能日志记录的常见选择,并被广泛应用于许多生产应用中。
2.1、Maven 依赖 在 pom.xml 中添加 spring-boot-starter-log4j2 依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <version>2.5.2</version> </dependency> 要在 Spring Boot 应用中配置 Log4j2,需要从 pom.xml 中的任何 Starter 中排除默认的 Logback 日志框架。
在本文示例项目中,只有 spring-boot-starter-web Starter 依赖。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> 2.2、Log4j2 配置 现在,创建 Log4j2 配置文件。Spring Boot 会在 classpath 中搜索 log4j2-spring.xml 或 log4j2.xml 文件。
在 resource 目录中配置一个示例 log4j2-spring.
1、简介 Content Type 表示请求/响应数据的媒体类型(Media Type)。当 Conroller 收到 Web 请求时,它会根据 Content Type 解析请求数据,然后根据 Content Type 响应数据。目前在 REST 中最流行的 Content Type 就是 JSON。
本文将会带你了解如何在 Spring MVC 中设置请求和响应的 Content Type。
2、@RequestMapping 注解 简而言之,@RequestMapping 是将 Web 请求映射到 Spring Controller 的重要注解。它有各种属性,包括 HTTP 方法、请求参数、Header 和媒体类型。
一般来说,媒体类型分为两类:消费(请求)、生产(响应)。也可以在 Spring 中定义自定义媒体类型。
其目的在于限制 Handler 可消费、生产的媒体类型。
2.1、请求的媒体类型 通过 consumes 属性指定 Controller 可接受的媒体类型,可以有多个。
定义一个简单的端点:
@RequestMapping(value = "/greetings", method = RequestMethod.POST, consumes="application/json") public void addGreeting(@RequestBody ContentType type, Model model) { } 如果 Controller 不支持客户端指定的媒体类型,则会返回 HTTP “415 Unsupported Media Type” 错误。
1、概览 有时我们需要在 Spring Boot 应用的不同路径上应用多个 Security Filter。
本文将带你了解在 Spring Scurity 中自定义 Security 的两种方法 - 通过使用 @EnableWebSecurity 和 @EnableGlobalMethodSecurity。
本文通过一个简单的应用示例来说明这两者的区别。该应用包含一些管理员(ADMIN)才能访问的资源和一些只有认证了的用户(USER)才能访问的资源以及一些任何人都可以访问、下载的公共资源。
2、Spring Boot 整合 Spring Security 2.1、Maven 依赖 无论采用哪种方法,都需要添加 Spring Boot Stater 依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 2.2、Spring Boot 自动配置 当 classpath 上存在 Spring Security 时,Spring Boot Security Auto-Configuration 的 WebSecurityEnablerConfiguration 就会激活 @EnableWebSecurity。这会在应用中加载默认的安全配置。
默认的安全配置会激活 HTTP Security Filter 和 Security Filter Chain,并对端点应用 Basic Authentication 认证。
3、保护端点 第一种方式,创建一个 MySecurityConfigurer 类,使用 @EnableWebSecurity 对其进行注解。
@EnableWebSecurity public class MySecurityConfigurer { } 3.
1、概览 本文将会带你了解如何在 Spring Boot 应用中修改 Log4j2 配置文件的默认位置。
2、通过配置文件更改 默认情况下,把 Log4j2 配置文件(log4j2.xml / log4j2-spring.xml)放在项目的 classpath 或 resources 文件夹中。
可以在 application.properties 中修改该文件的位置:
logging.config=/path/to/log4j2.xml 3、通过 VM 参数修改 还可以在运行程序时通过以下 VM 参数来指定 log4j2 的配置文件:
-Dlogging.config=/path/to/log4j2.xml 4、编程式配置 最后,还可以通过更改 Spring Boot Application 类,以编程方式配置该文件的位置:
@SpringBootApplication public class Application implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Override public void run(String... param) { // Log4j2 的 Configurator 类 Configurator.initialize(null, "/path/to/log4j2.xml"); } } 这种解决方案有一个缺点:应用启动过程不会使用 Log4j2 输出日志。
1、简介 DispatcherServlet 在 Spring 应用中扮演着重要角色,它为应用提供了一个入口点。Context Path 定义了终端用户访问应用的 URL。
本文将带你了解 Spring 中 Context Path(上下文路径)与 Servlet Path(Servlet 路径)的区别。
2、Context Path 简而言之,Context Path 是访问 Web 应用时使用的名称。它是应用的根路径。默认情况下,Spring Boot 在 ROOT 上下文路径("/")上提供服务。
因此,默认情况下,Spring Boot 应用可以通过 http://localhost:8080/ 访问。
不过,在某些情况下,我们可能需要更改应用的 Context。配置 Context Path 有多种方法,最简单的方式就是通过位于 src/main/resources 文件夹下的 application.properties 进行配置。
server.servlet.context-path=/demo 如上,此时应用的主页为:
http://localhost:8080/demo 特别是在把应用部署到外部服务器时,往往需要修改应用的 Context Path,以便于其他一起部署的应用分开来。
3、Servlet Path Servlet Path 表示 DispatcherServlet 的 Path。DispatcherServlet 是一个实际的 Servlet,继承自 HttpSerlvet 。默认值与 Context Path 类似,即(“/”):
spring.mvc.servlet.path=/ 在 Boot 的早期版本中,该属性位于 ServerProperties 类中,名称为 server.servlet-path=/。
从 2.
1、简介 在 Apache Kafka 中传输消息时,客户端和服务器会就使用共同的语法格式达成协议。Apache Kafka 提供了默认的转换器(Converter),如 String 和 Long。同时也支持针对特定用例的自定义序列化器 (Serializer)。
2、Apache Kafka 中的 Serializer 序列化是将对象转换为字节的过程。反序列化则是将字节流转换为对象的逆过程。简而言之,它将内容转换为可读和可解释的信息。
如上所述,Apache Kafka 为几种基本类型提供了默认序列化器,并允许我们实现自定义序列化器:
上图显示了通过网络向 Kafka Topic 发送消息的过程。在此过程中,生产者将消息发送到 Topic 之前,自定义序列化器会将对象转换成字节。同样,它也显示了反序列化器如何将字节转换回对象,以便消费者正确处理。
2.1、自定义 Serializer Apache Kafka 为几种基本类型提供了预置的序列化器和反序列化器:
StringSerializer ShortSerializer IntegerSerializer LongSerializer DoubleSerializer BytesSerializer 它也提供了实现自定义序列化器/反序列化器的功能。为了序列化自己的对象,需要实现 Serializer 接口。同样,要创建自定义的反序列化器,需要实现 Deserializer 接口。
这两个接口都有可覆写的方法:
configure:用于实现配置细节 serialize / deserialize:这些方法包括自定义序列化和反序列化的实际实现 close:使用该方法关闭 Kafka Session 3、实现自定义 Serializer Kafka 提供了自定义序列化器的功能。可以为消息的 Key 和 Value 实现特定的转换器(Converter)。
3.1、依赖 在 pom.xml 中添加 Kafka Consumer API 依赖:
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.4.0</version> </dependency> 3.