1、简介 本文将带你了解 Maven 中的预定义属性。
2、Maven 预定义属性 Maven 有一些方便的内置属性,可以于简化配置。
如果需要,甚至可以直接在 pom.xml 文件中自定义它们。
这些属性也可以在任何由 Maven 资源插件的过滤功能处理的资源文件中使用,例如 application.properties 文件。在使用这些属性时,只需要将它们包装在 ${} 中。
2.1、使用示例 示例如下,使用输出目录位置属性:
<?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>example.override.properties</groupId> <artifactId>parameter-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <packaging>maven-plugin</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>3.2</version> <configuration> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </plugin> </plugins> </build> </project> 上面的示例展示了如何获取 ${project.build.directory} 的默认值,即 src/main/resources。
2.2、属性覆盖示例 自定义构建路径的属性:
<?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>example.override.properties</groupId> <artifactId>parameter-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <packaging>maven-plugin</packaging> <build> <directory>src/main/resources/custom</directory> </build> </project> 如上,通过在 <project> -> <build> -> <directory> 中指定自定义值,将 ${project.build.directory} 属性的默认值覆盖为 src/main/resources/custom。
Spring AI 1.0.0-SNAPSHOT 在构件 ID、依赖管理和自动配置方面引入了几项重要变更。
本文将带你了解这些变更并提供项目更新指南。
最显著的变更是 Spring AI Starter 构件的命名模式:
模型 starter:spring-ai-{model}-spring-boot-starter → spring-ai-starter-model-{model} 向量存储 starter:spring-ai-{store}-store-spring-boot-starter → spring-ai-starter-vector-store-{store} MCP starter:spring-ai-mcp-{type}-spring-boot-starter → spring-ai-starter-mcp-{type} 此外,你需要添加快照仓库并更新 Dependency Management (依赖管理)配置。
有两种方式可以将项目更新到 Spring AI 1.0.0-SNAPSHOT:使用 AI 工具自动更新 或 手动更新。自动方式利用 Claude Code 快速转换你的项目,而手动方式为那些喜欢直接进行更改的人提供了逐步说明。
使用 Claude Code 自动更新 对于偏好自动化方式的用户,你可以使用 Claude Code CLI 工具,通过提供的提示自动将项目升级到 1.0.0-SNAPSHOT。这种方法可以在升级多个项目或复杂代码库时节省时间并减少错误。更多详情,请参阅升级说明中的 使用 AI 自动升级 部分。
这里仅以屏幕截图的形式展示 Claude Code CLI 工具将执行的步骤。
更新 BOM 版本。
添加仓库。
更新 starter。
全部完成!
手动更新 添加快照仓库 要使用 1.0.0-SNAPSHOT 版本,你需要在构建文件(pom.xml)中添加相应的快照仓库。其中,Central Sonatype Snapshots 仓库(https://central.
1、简介 本文将带你了解如何在 Jackson 中通过 @JsonFilter、@JsonView 和 Jackson Mixin(混合) 实现动态忽略字段。
2、项目设置 添加 Jackson 库:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.2</version> </dependency> 最新版本可在 此处 找到。
3、使用 @JsonFilter 第一种方法是通过 @JsonFilter 注解指定在序列化过程中使用的过滤器。
使用 @JsonFilter 对类进行注解:
@JsonFilter("publicFilter") // 指定 Filter 名称 public class UserWithFilter { private Long id; private String name; //Getter/Setter 忽略 } 然后,动态配置 ObjectMapper,并注册 PropertyFilter 来序列化除 id 之外的所有字段:
SimpleFilterProvider filterProvider = new SimpleFilterProvider(); // 注册 Filter,指定名字 filterProvider.addFilter("publicFilter", SimpleBeanPropertyFilter.serializeAllExcept("id")); ObjectMapper objectMapper = new ObjectMapper().setFilterProvider(filterProvider); 然后,使用 objectMapper 序列化 UserWithFilter 对象:
本文将带你了解如何在 Spring Boot 中使用 spring-ai 无缝接入 DeepSeek 和通义千问来构建自己的 AI 应用。
Spring & JDK 版本:
springboot 3.4.3 jdk17 1、maven依赖 <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency> 2、application.yaml 配置 # DeepSeek 配置,完全兼容openai配置 # spring: # ai: # openai: # base-url: https://api.deepseek.com # DeepSeek的OpenAI式端点 # api-key: sk-xxxxxxxxx # chat.options: # model: deepseek-chat # 指定DeepSeek的模型名称 # 通义千问配置 spring: ai: openai: base-url: https://dashscope.aliyuncs.com/compatible-mode # 通义千问 api-key: sk-xxxxxxxxxxx chat.options: model: qwen-plus 3、Controller package org.example.springboot3ds.controller; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.
Null Safety 旨在防止空指针(NullPointerException)异常。
最初在 Spring 中引入 Null Safety 支持要追溯到 2017 年发布的 Spring Framework 5.0。2025 年,我们会继续完善这一功能,为 Java 或 Kotlin 的 Spring 开发人员带来更多附加值。
我们要解决什么问题? 举一个具体的例子,假设我们正在使用一个提供 TokenExtractor 接口的库,其定义如下:
interface TokenExtractor { /** * Extract a token from a {@link String}. * @param input the input to process * @return the extracted token */ String extractToken(String input); } 如果由于某种原因实现返回 null 值,在 token.length() 中访问 null 引用(如下所示)会导致 NullPointerException 异常,通常会在运行时产生状态码为 500 Internal Server Error 的 HTTP 响应。
1、概览 HTTP/2 是广泛使用的 HTTP/1.1 协议的后续协议,它通过采用多路复用和 Header 压缩等新功能提高了网络性能。
本文将带你了解如何配置 Spring Boot 应用,以在嵌入式 Tomcat 服务器上启用 HTTP/2。
2、HTTP/2 超文本传输协议(HTTP)是一种在互联网上获取资源的应用协议。HTTP/1.1 于 1997 年 1 月发布,二十多年来为大多数网络提供服务。该版本发现了在某些情况下导致性能缓慢的问题。
HTTP/2 克服了 HTTP/1.1 中的性能问题,具有以下特点:
多路复用 - HTTP/1.1 使用多个连接发送多个请求;多路复用允许通过单个连接发送请求,从而减少资源消耗和延迟 Header 压缩 - 如果不进行压缩,由于 TCP 启动速度较慢,通常需要多次往返才能发送 Header;压缩 Header 后,Header 的发送往返次数会减少,大部分时间都能在一次往返内完成 二进制 - 与使用文本编码数据的 HTTP/1.1 相比,HTTP/2 以二进制格式发送数据,以减少解析开销并缩小报文大小。 3、先决条件 HTTP/2 可以通过明文或 TLS 运行。大多数 Web 浏览器不支持明文 HTTP/2,因此建议通过 TLS 运行。
首先要在嵌入式 Web 服务器上启用 SSL。
在控制台中运行以下 keytool 命令来生成一个 keystore,用于存储 SSL/TLS 使用的密钥和证书,并将其放入嵌入式 Tomcat 中。
$ keytool -genkeypair -alias http2-alias -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.
1、简介 本文将带你了解如何将 Google Translate API 集成到 Java 应用中,谷歌的翻译服务支持 100 多种语言,通过它的 API,我们可以轻松构建一个可以执行实时语言翻译的应用。
2、添加 SDK 依赖 首先,在 pom.xml 文件中添加 Google Cloud Translate 依赖:
<dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-translate</artifactId> </dependency> Google Cloud Translate 提供了与 API 交互的简易接口。它会处理我们的应用与 Google 翻译服务之间的所有通信。
3、初始化 Translate 客户端 依赖添加后,下一步就是在 Java 应用中初始化 Translate 客户端。这需要使用从 Google Cloud Console 获取的服务帐户 JSON 文件进行身份验证。这种方法更安全,建议用于服务器端应用。
接下来,需要确保服务帐户已启用云翻译 API 并分配给 Google Cloud 中的云翻译 API 用户角色。
然后,通过 TranslateOptions 设置 API 凭证等配置,然后初始化 Translate 客户端:
class Translator { static { initializeTranslateClient(); } public static void initializeTranslateClient() { if (translate == null) { try { GoogleCredentials credentials = GoogleCredentials.
1、概览 Spring Security 是一个功能强大、高度可定制的 Java 应用身份认证和访问控制框架。本文将带你了解 Spring Security 的基本概念,以及一些可能需要禁用它的常见场景,例如在 开发、测试 或 使用自定义安全机制 时。
2、禁用 Spring Security 我们可以通过多种方式禁用 Spring Security:
使用自定义安全(Security)配置 利用 Spring Profile 移除 Spring Security 依赖 排除 Spring Security 自动配置 先通过 Spring Initializr 创建一个基于 Maven 的最小 Spring Boot 项目,其中包含一个 Controller,作为我们的测试端点:
@RestController @RequestMapping("/api") public class PublicController { @GetMapping("/endpoint") public ResponseEntity<String> publicEndpoint() { return ResponseEntity.ok("This is a public endpoint."); } } 3、使用自定义 Security 配置 禁用 Spring Security 的最直接方法之一就是创建自定义 Security 配置类。这种方法包括定义和配置 SecurityFilterChain Bean,以允许所有未经身份验证的请求:
1、概览 现代 Web 应用越来越多地与大型语言模型(LLM)集成,以构建解决方案。
DeepSeek 是一家中国的 AI 研究公司,致力于开发功能强大的 LLM,最近凭借其 DeepSeek-V3 和 DeepSeek-R1 模型颠覆了人工智能世界。DeepSeek-V3 和 DeepSeek-R1 模型揭示了它的思维链(CoT),让我们了解了 AI 模型是如何解释和处理给定提示的。
本文将带你了解如何将 DeepSeek 模型与 Spring AI 集成,以构建一个能够进行多轮文本对话的简单聊天机器人。
2、依赖和配置 有多种方法可以将 DeepSeek 模型集成到我们的应用中。
2.1、使用 OpenAI DeepSeek 模型与 OpenAI API 完全兼容,可以使用任何 OpenAI 客户端或库进行访问。
首先,在项目的 pom.xml 文件中添加 Spring AI 的 OpenAI Starter 依赖:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency> 由于当前的 1.0.0-M6 版本是里程碑版本,因此还需要在 pom.xml 中添加 Spring Milestones Repository:
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> 该 Repository 是发布里程碑版本的地方,而不是标准的 Maven Central Repository。无论我们选择哪种配置选项,都需要添加这个里程碑 Repository。
1、概览 在配置 Java 应用时,我们经常需要在不修改脚本的情况下传递 JVM 选项。
我们可以使用环境变量 JDK_JAVA_OPTIONS 或 JAVA_TOOL_OPTIONS,而不是每次运行 java 命令时都手动添加标记。这两个环境变量的作用相同:动态传递 JVM 选项,但它们的工作方式不同。
本文将带你了解它们的区别、何时使用每种配置以及有效管理 JVM 配置的最佳实践。
2、JDK_JAVA_OPTIONS 和 JAVA_TOOL_OPTIONS 是什么? 这两个环境变量都允许我们在全局范围内指定 JVM 选项,从而省去了每次执行 JDK 工具(如 java、javac、javadoc 等)时修改选项的麻烦。
JAVA_TOOL_OPTIONS 在 Java 5 中引入。它们的行为和目的截然不同。
在深入了解每个环境变量的功能之前,先创建一个简单的 Java 源码文件:
package com.baeldung; /** * 一个用于打印某些变量值的简单类 */ public class TestEnvVar { public static void main (String[] args){ System.out.println("var1 = '" + System.getProperty("var1") + "'"); System.out.println("var2 = '" + System.getProperty("var2") + "'"); } } 上面的代码非常简单。我们的 main() 方法会打印出 var1 和 var2 的值。稍后,我们将使用这两个环境变量把参数传递给这个类。