spring boot之swagger与fastjson的使用

本文介绍如何使用Swagger生成RESTful API文档,包括配置依赖、创建配置类及控制器,并演示增删改查操作,还介绍了参数说明、实体类get/set方法自动生成及数据转换技巧。

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

目录

配置准备

简单示例

增删改的使用

添加参数说明

getter,setter的使用

Translator转换



配置准备

pom文件中添加依赖:

       <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

添加配置类,命名SwaggerConfig

添加如下代码

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket swaggerSpringMvcPlugin() {
        return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).build();
    }
}

简单示例

 添加SwaggerController类,

添加如下代码

@Api(description = "Swagger接口")
@RestController
@RequestMapping("/swagger")
public class SwaggerController {
    /**
     * 商品service
     */
    @Autowired
    private GoodsService goodsService;

    @ApiOperation(value = "查询商品", notes = "查询商品")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "goodsId", value = "商品编码", required = true, paramType = "query", dataType = "String")
    })
    @RequestMapping(value = "/listGoods", method = RequestMethod.GET)
    public GoodsDO listGoods(@RequestParam("goodsId") String id) {
        Integer queryId = Integer.valueOf(id);
        GoodsDO goodsDO = goodsService.getById(queryId);
        System.out.println("print result***");
        System.out.println(goodsDO);
        return goodsDO;
    }

 
}


编译运行,打开http://localhost:8080/swagger-ui.html#/

 至此,简单的swagger应用实例完成

增删改的使用

在controller层SwaggerController中继续添加增删改三个方法,代码为:

    @ApiOperation(value = "新增", notes = "新增")
    @RequestMapping(value = "/create", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void addGoods(@RequestBody GoodsDO goodsDO) {
        goodsService.addRecord(goodsDO);

    }

    @ApiOperation(value = "修改", notes = "修改")
    @RequestMapping(value = "/update", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void update(@RequestBody ModifyParam modifyParam) {
        GoodsDO goods = GoodsTranslator.transParamToDO(modifyParam);
        GoodsDO goodsDO = GoodsTranslator.translatorWithFastJson(modifyParam);
        System.out.println("update:::");
        goodsService.modifyRecord(goodsDO);
    }

    @ApiOperation(value = "删除", notes = "删除")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "goodsId", value = "标识", required = true, paramType = "query", dataType = "String")
    })
    @RequestMapping(value = "/delete", method = RequestMethod.DELETE)
    public void delete(@RequestParam("goodsId") String goodsId) {
        System.out.println("delete:::" + goodsId);
        GoodsDO goodsDO = new GoodsDO();
        goodsDO.setId(Integer.valueOf(goodsId));
        goodsService.deleteRecord(goodsDO);
    }

刷新  http://localhost:8080/swagger-ui.html#/

 新增一个商品记录:

数据库新增后

修改一条记录

修改后数据库中的记录

添加参数说明

在controller中另建一个param文件夹用于放置各个查询参数、修改参数的实体,通过添加说明在swagger中显示各个参数的意义。

1. 新建一个ModifyParam类 

2. 添加如下代码

@ApiModel("规则查询参数")
public class ModifyParam {

    @ApiModelProperty("id")
    private Integer id;

    @ApiModelProperty("编码")
    private Long code;

    @ApiModelProperty("名称")
    private String name;

    @ApiModelProperty("条形码")
    private String barcode;

    @ApiModelProperty("价格")
    private BigDecimal price;

    @ApiModelProperty("库存数量")
    private Long stock;
}

3. 修改controller中更新方法的代码,这里的转换在下一小节中


    @ApiOperation(value = "修改", notes = "修改")
    @RequestMapping(value = "/update", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
    public void update(@RequestBody ModifyParam modifyParam) {
        GoodsDO goods = GoodsTranslator.transParamToDO(modifyParam);
        GoodsDO goodsDO = GoodsTranslator.translatorWithFastJson(modifyParam);
        System.out.println("update:::");
        goodsService.modifyRecord(goodsDO);
    }

4. 刷新swagger,查看更新方法

在Models中可以看到相关实体

getter,setter的使用

在实体类中,根据需要会写大量的get,set方法,为避免重复操作,简化代码,可以使用相关插件,使实体类自动生成相关get,set方法。

1. pom添加依赖

 <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>

 

2. 安装插件:Settings->Plugins->Browse Repositories中安装Lombok重启IDEA

3. 重新编译后在target的相关class文件中可以看到生成了get,set方法

Translator转换

在controller接收传入参数的时候,或者将查询的结果封装成VO,DTO形式返回时,通常需要进行一些转换。可利用阿里的fastjson进行快速转换。fastjson可学习https://github.com/alibaba/fastjson

1. 添加pom依赖

       <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.56</version>
        </dependency>

2. 在controller层新建两个转换类,商品转换类和通用转换类

 3. 商品转换类GoodsTranslator代码:

/**
 * @Author: windmill
 * @Description:商品转换类
 * @Date: 2019/4/2 19:32
 */
public class GoodsTranslator {
    /**
     * 将修改参数转DO
     *
     * @param modifyParam
     * @return
     */
    public static GoodsDO transParamToDO(ModifyParam modifyParam) {
        GoodsDO goodsDO = new GoodsDO();

        goodsDO.setId(modifyParam.getId());
        goodsDO.setBarcode(modifyParam.getBarcode());
        goodsDO.setCode(modifyParam.getCode());
        goodsDO.setName(modifyParam.getName());
        goodsDO.setPrice(modifyParam.getPrice());
        goodsDO.setStock(modifyParam.getStock());
        return goodsDO;
    }

    /**
     * 通过 fastjson 将修改参数转换为DO
     *
     * @param modifyParam
     * @return
     */
    public static GoodsDO translatorWithFastJson(ModifyParam modifyParam) {
        return JSON.parseObject(JSON.toJSONString(modifyParam), GoodsDO.class);
    }

}

上述两种转换方法,一种是利用get,set手动转换,另一中则通过利用fastjson快速转换

4. 通用转换类,提供单个对象转换和列表转换

**
 * @Author: windmill
 * @Description:通过fastjson对目标对象或对象列表进行转换
 * @Date: 2019/4/2 19:42
 */
public class CommonTranslator {
    /**
     * Fastjson单个对象转换
     *
     * @param source 要转换的对象
     * @param target 转换后的目标对象
     * @param <T> 对象模板类型
     * @return 返回JSON转换的匹配对象
     */
    public static <T> T translator(Object source, Class<T> target) {
        return JSON.parseObject(JSON.toJSONString(source), target);
    }

    /**
     * 通过fastjson进行列表转换
     *
     * @param objectList 转换对象的列表集合
     * @param target     转换后的目标对象集合
     * @param <T>
     * @return 返回转换后对象的匹配集合
     */
    public static <T> List<T> listTranslator(List objectList, Class<T> target) {
        List<T> tList = new ArrayList();
        objectList.forEach((object) -> {
            T t = JSON.parseObject(JSON.toJSONString(object), target);
            tList.add(t);
        });
        return tList;
    }
}

 

 

 

<think>嗯,用户现在想了解如何在Spring Boot使用FastJSON处理之前提到的JSON数据结构。之前已经给出过解析方案,现在需要从头到尾详细说明步骤。首先,我需要确认用户对Spring BootFastJSON的熟悉程度,可能他们需要从基础开始讲解,比如添加依赖、配置FastJSON以及具体的代码实现。 用户提供的JSON结构是包含问答对的数组,每个对象有type、time、contentrole字段。目标是将这些数据解析为Java对象,并转换为问答对列表。用户可能已经看过之前的解析方案,现在需要更详细的步骤,特别是在Spring Boot项目中如何整合FastJSON来实现。 首先,我应该从创建Spring Boot项目开始,使用Spring Initializr,添加必要的依赖,比如Spring WebFastJSON。然后,配置FastJSON作为默认的JSON处理器,覆盖默认的Jackson。这里需要说明如何通过继承WebMvcConfigurer来配置消息转换器。 接下来,定义实体类,如ChatMessageQaPair,确保字段JSON结构对应,并添加必要的注解,比如@JSONField来处理日期格式。这里可能需要提醒用户注意日期格式的处理,使用Java 8的LocalDateTime相应的格式化器。 然后,编写解析逻辑,将JSON字符串转换为ChatMessage列表,再根据type字段配对问答。这里有两种方法,顺序匹配动态类型匹配,需要解释各自的适用场景,比如当数据可能存在间隔或其他消息类型时,动态匹配更可靠。 还需要提到数据校验,比如检查消息顺序时间顺序,确保回答在问题之后。异常处理也是关键,比如记录未匹配的问题或孤立的回答,避免程序因脏数据而崩溃。 最后,给出一个完整的Controller示例,展示如何接收JSON数据并返回处理后的问答对。可能还需要补充注意事项,比如性能优化、分页处理,以及如何在前端展示格式化后的时间。 要确保步骤清晰,代码示例正确,特别是FastJSON的配置部分,因为Spring Boot默认使用Jackson,替换时需要正确覆盖配置。同时,提醒用户在实际项目中的最佳实践,比如使用JSON Schema校验数据,处理时区问题,以及监控异常情况。 可能用户在实际操作中会遇到问题,比如依赖冲突或日期解析错误,所以需要强调这些常见问题的解决方法。此外,工具类的封装可以提高代码复用性,保持Controller层的简洁。 总结来说,需要分步骤引导用户完成整个流程,从项目搭建到代码实现,再到数据校验异常处理,确保他们能够顺利在Spring Boot使用FastJSON处理指定的JSON数据。</think>以下是基于Spring Boot整合FastJSON实现JSON数据解析的完整技术方案,共分为六个步骤: --- ### 一、环境准备 #### 1. 创建Spring Boot项目 ```bash # 使用Spring Initializr创建项目 spring init -d=web,devtools -g=com.example -a=demo fastjson-demo ``` #### 2. 添加FastJSON依赖 ```xml <!-- pom.xml --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.42</version> </dependency> ``` --- ### 二、FastJSON配置 #### 1. 配置为默认JSON处理器 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converters.add(0, converter); // 覆盖默认Jackson } } ``` #### 2. 配置序列化规则(可选) ```java @Bean public HttpMessageConverters fastJsonConverters() { FastJsonConfig config = new FastJsonConfig(); config.setSerializerFeatures( SerializerFeature.PrettyFormat, SerializerFeature.WriteDateUseDateFormat ); FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converter.setFastJsonConfig(config); return new HttpMessageConverters(converter); } ``` --- ### 三、核心实体定义 #### 1. 数据库原始消息结构 ```java public class ChatMessage { @JSONField(name = "type") private String msgType; @JSONField(name = "time", format = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime timestamp; private String content; private String role; // getters/setters } ``` #### 2. 目标问答对结构 ```java public class QaPair { @JSONField(ordinal = 1) private String question; @JSONField(ordinal = 2) private String answer; @JSONField(format = "yyyy-MM-dd HH:mm") private LocalDateTime qTime; @JSONField(format = "yyyy-MM-dd HH:mm") private LocalDateTime aTime; // getters/setters } ``` --- ### 四、核心解析逻辑 #### 1. 基础解析方法 ```java public List<QaPair> parseChatData(String jsonStr) { // 原始数据解析 List<ChatMessage> messages = JSON.parseArray(jsonStr, ChatMessage.class); List<QaPair> result = new ArrayList<>(); ChatMessage pendingQuestion = null; for (ChatMessage msg : messages) { switch (msg.getMsgType().toLowerCase()) { case "question": pendingQuestion = msg; break; case "answer": if (pendingQuestion != null) { result.add(createPair(pendingQuestion, msg)); pendingQuestion = null; } break; default: log.warn("未知消息类型: {}", msg.getMsgType()); } } return result; } private QaPair createPair(ChatMessage q, ChatMessage a) { QaPair pair = new QaPair(); pair.setQuestion(q.getContent()); pair.setAnswer(a.getContent()); pair.setQTime(q.getTimestamp()); pair.setATime(a.getTimestamp()); validateTimeOrder(q, a); // 时间顺序校验 return pair; } ``` #### 2. 数据校验增强 ```java private void validateTimeOrder(ChatMessage q, ChatMessage a) { if (a.getTimestamp().isBefore(q.getTimestamp())) { throw new IllegalStateException( String.format("回答时间异常!问题时间:%s 回答时间:%s", q.getTimestamp(), a.getTimestamp()) ); } } ``` --- ### 五、完整Controller示例 ```java @RestController @RequestMapping("/api/chat") public class ChatController { @PostMapping("/parse") public ResponseEntity<?> parseChatHistory(@RequestBody String rawJson) { try { List<QaPair> pairs = new ChatParser().parseChatData(rawJson); return ResponseEntity.ok(pairs); } catch (JSONException e) { return ResponseEntity.badRequest().body("JSON格式错误"); } catch (IllegalStateException e) { return ResponseEntity.status(409).body(e.getMessage()); } } } ``` --- ### 六、测试验证 #### 1. 测试请求示例 ```http POST /api/chat/parse Content-Type: application/json [ { "type": "question", "time": "2023-10-01T10:00:00", "content": "如何学习Spring Boot?", "role": "user" }, { "type": "answer", "time": "2023-10-01T10:01:00", "content": "可以从官方文档开始...", "role": "assistant" } ] ``` #### 2. 预期响应 ```json [ { "question": "如何学习Spring Boot?", "answer": "可以从官方文档开始...", "qTime": "2023-10-01 10:00", "aTime": "2023-10-01 10:01" } ] ``` --- ### 关键注意事项 1. **日期处理技巧** ```java // 自定义日期格式(覆盖默认配置) @JSONField(format = "yyyy/MM/dd HH:mm") private LocalDateTime timestamp; ``` 2. **大文件处理优化** ```java // 使用JSONReader处理流式数据 try (FileReader reader = new FileReader("large.json")) { JSONReader jsonReader = new JSONReader(reader); jsonReader.startArray(); while (jsonReader.hasNext()) { ChatMessage msg = jsonReader.readObject(ChatMessage.class); // 处理逻辑 } jsonReader.endArray(); } ``` 3. **防御性编程** ```java // 空值保护 @JSONField(name = "content") private String content = ""; // 默认空字符串 ``` 4. **性能监控建议** ```java // 添加解析耗时监控 @Around("execution(* com.example.service.ChatParser.*(..))") public Object logPerformance(ProceedingJoinPoint pjp) throws Throwable { long start = System.currentTimeMillis(); Object result = pjp.proceed(); log.info("方法 {} 执行耗时: {}ms", pjp.getSignature().getName(), System.currentTimeMillis() - start); return result; } ``` 通过以上步骤,即可在Spring Boot中完整实现基于FastJSON的JSON数据处理流程。建议在实际项目中结合Swagger生成API文档,并添加单元测试覆盖边界情况。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值