SpringBoot2使用Gson替代jackson并适配Swagger

本文介绍在SpringBoot2中使用Gson替代默认的Jackson进行数据转换的方法,并适配Swagger,详细步骤包括创建GsonHttpMessageConverter、设置日期格式及特殊类型转换规则,以及在启动类中禁用JacksonAutoConfiguration。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringBoot2使用Gson替代jackson并适配Swagger

涉及到的软件版本

  • SpringBoot:2.2.5.RELEASE
  • gson:2.8.6
  • springfox-swagger2:2.9.2

为什么使用Gson

Gson与fastJson、jackson相比,对泛型的支持比fastJson、jackson都要好。对于并不特别复杂的小型简单数据结构的转换处理,性能上有明显优势。所以弃用SpringBoot2中内置的jackson,用Gson替代。

如何使用Gson

spring-boot-starter-web中已经引了Gson的依赖,所以pom.xml中无需改动。

思路

1、创建一个GsonHttpMessageConverter,通过setDateFormat("yyyy-MM-dd")指定日期格式,通过registerTypeAdapter(Json.class, new GsonConfig())指定特殊类型的转换规则(用于解决springfox不支持Gson的问题)。
2、再将GsonHttpMessageConverter放入HttpMessageConverters中。
3、在SpringApplication启动类中禁止JacksonAutoConfiguration

完整代码示例

Gson配置类
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;

import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import springfox.documentation.spring.web.json.Json;
/**
 * SpringfoxJsonToGsonAdapter
 */
@Configuration
public class GsonConfig implements JsonSerializer<Json> {
    
    @Bean
    public HttpMessageConverters customConverters() {

        Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
        gsonHttpMessageConverter.setGson(
        		new GsonBuilder()
        			.setDateFormat("yyyy-MM-dd")
        			.registerTypeAdapter(Json.class, new GsonConfig())
        			.create());
        messageConverters.add(gsonHttpMessageConverter);

        return new HttpMessageConverters(true, messageConverters);
    }

	@SuppressWarnings("deprecation")
	@Override
	public JsonElement serialize(Json json, Type type, JsonSerializationContext context) {
		final JsonParser parser = new JsonParser();
        return parser.parse(json.value());
	}
}
SpringApplication启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;

/**
 * SpringApplication
 */
...
@SpringBootApplication(exclude = { JacksonAutoConfiguration.class })
public class MyBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyBootApplication.class, args);
    }
}
<think>嗯,用户之前问过关于他们工厂部署了DeepSeek系统后是否需要继续投喂数据,以及排单和路线规划是否需要他们学习编程来自行操作的问题。我之前回答了需要根据部署模式决定数据投喂,建议学习Python和相关课程来使用API。现在用户的新问题是,是否必须使用Python,Java是否可行。 首先,我需要确认用户为什么会问这个问题。可能用户或他们的团队更熟悉Java,或者现有的系统是基于Java开发的,想要集成DeepSeek的功能。也可能是他们看到我之前的示例代码用了Python,担心必须用Python才能调用API。 接下来,我要思考DeepSeek的API通常是否只支持Python,或者是否支持其他语言。一般来说,REST API是语言无关的,可以用任何能发送HTTP请求的语言调用,比如Java、C#、JavaScript等。所以核心点应该是API的兼容性,而不是特定的编程语言。 然后,我需要考虑用户可能的需求。用户可能想知道他们是否需要学习Python,或者能否继续使用现有的Java技能。需要明确说明Java是可行的,给出示例代码,这样用户更有信心。同时,可能需要比较Python和Java在调用API时的便利性,比如库的支持和代码的简洁性,但最终要强调语言不是限制因素。 另外,用户可能关心是否有现成的SDK或库支持Java,或者是否需要自己处理HTTP请求和JSON解析。如果DeepSeek官方提供了Java SDK,那会更方便,但如果没有,用户仍然可以用Java的标准库来实现。 还需要提醒用户注意API的认证方式(如Bearer Token)、请求头设置、数据格式(JSON)等,这些在Java中如何实现。给出具体的代码示例会很有帮助,比如使用Java的HttpClient或者第三方库如OkHttp、Spring的RestTemplate。 最后,应该总结关键点,强调语言选择取决于现有技术栈和团队熟悉度,API调用本身是语言无关的,同时建议用户查阅官方文档获取具体的API细节和可能的SDK支持。</think>关于使用Java调用DeepSeek系统的问题,以下是具体解答: ### 一、语言选择原则 **无需限定Python**,现代系统的API接口设计通常遵循以下特征: 1. **协议无关性**:通过REST/HTTP协议通信,支持任何能发起网络请求的语言 2. **数据标准化**:请求/响应均使用JSON格式,Java可通过Jackson/Gson等库处理 3. **认证通用性**:采用Bearer Token等标准鉴权方式,与语言无关 ### 二、Java调用示例 使用Java 11+原生HTTP客户端实现排产请求: ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpRequest.BodyPublishers; public class DeepSeekScheduler { public static void main(String[] args) throws Exception { String apiUrl = "https://api.deepseek.com/scheduling"; String authToken = "your_api_key_here"; String jsonPayload = """ { "order_id": "PO-20231201", "products": ["A-01", "B-02"], "deadline": "2023-12-15" } """; HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(apiUrl)) .header("Content-Type", "application/json") .header("Authorization", "Bearer " + authToken) .POST(BodyPublishers.ofString(jsonPayload)) .build(); HttpResponse<String> response = client.send( request, HttpResponse.BodyHandlers.ofString() ); System.out.println("响应状态码:" + response.statusCode()); System.out.println("排产结果:" + response.body()); } } ``` ### 三、语言选择建议 | 对比维度 | Python优势 | Java优势 | |--|-----------------------------------| | **开发效率** | 代码简洁,适合快速原型开发 | 类型安全,适合大型系统集成 | | **运行环境** | 适合脚本化部署 | 适合容器化/微服务架构 | | **企业适配** | 常见于算法层对接 | 更符合传统工业软件的架构体系 | | **学习曲线** | 语法简单易上手 | 已有Java团队可快速实现生产级代码 | ### 四、关键实施步骤 1. **获取API文档**:向DeepSeek厂商索要OpenAPI/Swagger规范文件 2. **选择工具链**: - 基础方案:使用原生`java.net.http`包 - 高级方案:采用Spring Boot + WebClient(推荐企业级应用) 3. **数据处理建议**: ```java // 使用Jackson反序列化示例 ObjectMapper mapper = new ObjectMapper(); ScheduleResult result = mapper.readValue(response.body(), ScheduleResult.class); ``` ### 五、特别注意事项 1. **线程安全**:若涉及高频调用,建议使用连接池(如Apache HttpClient) 2. **异步处理**:对实时性要求高的场景可使用CompletableFuture: ```java client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body) .thenAccept(System.out::println); ``` 3. **工业协议扩展**:若需对接PLC等设备,可结合OPC UA Java库实现全链路集成 建议优先使用团队现有技术栈,无需因特定API切换语言。实际工业系统集成中,Java在以下场景更具优势:与MES/ERP系统对接、需要强类型校验的业务流程、高发调度任务等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jason9211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值