spring-dynamic-params

spring boot mvc参数类型转换,支持转换为子类对象访问以及参数验证

使用示例:

添加依赖

allprojects {

repositories {

...

maven { url 'https://jitpack.io' }

}

}

dependencies {

// 低版本gradle使用

// compile 'com.gitee.luws:spring-dynamic-params:Tag'

// 版本号查看仓库tag

implementation 'com.gitee.luws:spring-dynamic-params:0.1.3'

// 也可以使用GitHub

// implementation 'com.github.shenluw:spring-dynamic-params:0.1.3'

}

方法一

对实体对象添加@Sldp注解

@Sldp

public class Animal {

private String name;

private int age;

...

}

public class Dog extends Animal {

private String face;

private String speed;

...

}

创建添加访问接口

public class TestController {

private final static Logger log = getLogger(TestController.class);

@RequestMapping("/1")

public void test1(Animal a) {

log.info("test1: {}", a);

}

}

测试接口

request:

http://xxxxx/1?name=test&age=12&speed=120&sldp=top.shenluw.sldp.Dog

response:

a 实际类型为 Dog

方法二

为方法添加@Sldp注解

删除Animal上的注解

public class Animal {

private String name;

private int age;

...

}

修改访问接口

public class TestController {

private final static Logger log = getLogger(TestController.class);

@RequestMapping("/1")

public void test1(@Sldp Animal a) {

log.info("test1: {}", a);

}

}

测试接口

request:

http://xxxxx/1?name=test&age=12&speed=120&sldp=top.shenluw.sldp.Dog

response:

a 实际类型为 Dog

方法三

实体对象实现DynamicModel接口

删除Animal上的注解

public class Animal implements DynamicModel {

private String name;

private int age;

...

}

修改访问接口

public class TestController {

private final static Logger log = getLogger(TestController.class);

@RequestMapping("/1")

public void test1(Animal a) {

log.info("test1: {}", a);

}

}

测试接口

request:

http://xxxxx/1?name=test&age=12&speed=120&sldp=top.shenluw.sldp.Dog

response:

a 实际类型为 Dog

使用json对象请求

接口可以实现参数为json格式的请求并转换为对应的格式

修改访问接口,设置注解参数为Json类型即可支持

@RestController

public class TestController {

private final static Logger log = getLogger(TestController.class);

@RequestMapping("/1")

public void test1(@Sldp(type = ModelType.Json) Animal a) {

log.info("test1: {}", a);

}

}

修改请求参数,添加json数据对应的字段即可实现

http://xxxxx/1?sldpJson={"name":"test name","age":12}&sldp=top.shenluw.sldp.Dog

支持多个对象参数

修改访问接口,设置注解参数别名即可支持

@RestController

public class TestController {

private final static Logger log = getLogger(TestController.class);

@RequestMapping("/1")

public void test1(@Sldp(name = "a") Animal a, @Sldp(name = "b") Animal b) {

log.info("test1: {} {}", a, b);

}

}

修改请求参数,为不同别名设置不通类型

http://xxxxx/1?name=test&age=12&face=mm&speed=1233&height=11&a=top.shenluw.sldp.BDog&b=top.shenluw.sldp.Cat

为类型设置别名

修改yaml,将top.shenluw.sldp.Dog别名修改为myName

sldp:

# 为类型设置别名

type-alias:

myName: top.shenluw.sldp.Dog

把请求参数中的sldp值修改为myName即可实现

http://xxxxx/1?sldpJson={"name":"test name","age":12}&sldp=myName

添加加密设置

sldp:

# 开启加密,默认关闭

enable-security: true

# 开启加密后是否使用全局加密,默认只对设置了SlSecurity注解的方法使用加密

default-security: true

当前加密只支持json方式,默认只提供了base64的测试样例

添加新的加密方法只需要实现Encryptor接口,然后配置成bean既可以

@Bean

public Encryptor myEncryptor(){

return MyEncryptor();

}

设置默认配置

sldp:

enable: true # 是否启用

# 设置默认处理器,下面这个为参数默认以json方式解析

default-processor: top.shenluw.sldp.processor.JacksonDynamicParamsMethodProcessor

# 设置json解析时携带数据的参数名称,就是把上面的sldpJson改为mydata

json-data-name: mydata

# 设置携带实际类型的参数名称,就是把上面的sldp改为mytype

type-name: mytype

# 为类型设置别名

type-alias:

myName: top.shenluw.sldp.Dog

# 选择json解析方式,当前可用选项 gson, jackson2, 默认 jackson2

json-type: jackson2

# Json解析多态时选择把class类型写入json的属性

type-property-name: "@custom"

Jackson多态配置

可以在字段或者类上配置 @JsonTypeInfo,如果要直接使用配置文件中的type-alias,则需要添加 @JsonTypeResolver(TypeAliasResolverBuilder.class)

public class Mix extends Animal {

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)

@JsonTypeResolver(TypeAliasResolverBuilder.class)

private Animal dog;

}

Gson多态配置

使用Gson多态需要额外添加如下依赖,同时必须要配置type-alias关系才能正常使用

repositories {

...

maven { url 'https://artifactory.cronapp.io/public-release/' }

}

dependencies {

compileOnly 'com.google.code.gson:gson-extras:2.8.5'

}

dynamicparams java_spring-dynamic-params相关推荐

  1. flutter dio+rxdart

    线上flutter 接口请求基本架构(线上实际项目搭建 不多讲直接上代码) 首先添加库: pubspec.yaml 目录下: dio: ^2.1.2 #dio 请求框架rxdart: ^0.21.0 ...

  2. 【dart学习】-- Dart之函数

    1. 指定返回值得函数 /** * 无返回值的函数 * params: 可以是任意类型(var和Object类型也可以任意类型). 当然这里的参数类型你可以随意指定我这里已dynamic为例 * 参数 ...

  3. php绑定变量,php动态绑定变量的用法

    本文实例讲述了php动态绑定变量的用法.分享给大家供大家参考.具体如下: private function bindVars($stmt,$params) { if ($params != null) ...

  4. weex eros框架源码解析

    weex eros是基于alibaba weex框架进行二次封装的客户端跨平台开发框架,主要是为前端开发者(可以不用熟悉客户端开发)提供的一站式客户端app开发解决方案.官网地址为:https://b ...

  5. Flutter学习记录-关于一些常见实现

    底部导航栏 return new Scaffold(bottomNavigationBar: BottomNavigationBar(items: [BottomNavigationBarItem(i ...

  6. flutter基于provider状态管理设置主题颜色、实现简单登录、注册功能---页面+逻辑

    一.provider状态管理设置主题颜色 第一步: 安装依赖库 provider: ^4.3.2+3 第二步: 创建共享数据模型 import 'package:flutter/material.da ...

  7. native-JavaScript通信流程( 基于最新的 react native版本 )

    JavaScriptModule是用来实现java端对JavaScript端的调用,java端的JavaScriptModule只是抽象,用来找到JavaScript端对应的JavaScriptMod ...

  8. allegro使用汇总 [转贴]

    1.如何在allegro中取消花焊盘(十字焊盘) set up->design parameter -> shape->edit global dynamic shape param ...

  9. cadence常见技巧和错误。。。

    转载于: http://blog.sina.com.cn/s/blog_66da2afc0101a4ft.html 1.如何在allegro中取消花焊盘(十字焊盘) set up->design ...

  10. allegro 问题

    1.如何在 allegro 中取消花 焊盘 (十字焊盘)   set up-design parameter -   shape-edit global dynamic shape parameter ...

最新文章

  1. synchronized同步方法
  2. 视频中场的问题2009-04-03 19:38(一)
  3. 最新8篇ICML2020投稿论文:自监督学习、联邦学习、图学习、数据隐私、语言模型、终身学习...
  4. python的第三方库是干什么用的-Python 常用的标准库以及第三方库有哪些?
  5. 每日算法系列【LeetCode 330】按要求补齐数组
  6. jQuery.proxy用法
  7. jmeter系列六(processor)
  8. 网络爬虫的基本原理(一)
  9. 电子邮件系统是如何运作的?
  10. 全球及中国晶圆锯划片刀行业发展态势及投资潜力预测报告2021-2027年
  11. CorelDRAWX4的VBA插件开发(二十九)使用C++制作动态连接库DLL辅助VBA构键强大功能-(3)制作最简单的可供调用的DLL
  12. 程序员怎么才能让自己走得更高、更远?
  13. C++ yaml解析实战暨yaml-cpp库使用(1)认识yaml格式
  14. C++中的常成员函数以及const用于函数重载
  15. LINUX下的makefile学习(此文是我学习过程遇到问题时找到的所有回答,感谢其它大佬的回答,各个文章我都标明了原文链接)
  16. week16 CSP-M4-B ZJM要抵御宇宙射线
  17. 「开源之道」适兕:“关起门来搞开源,做不了开源世界的Leader”
  18. 单相桥式全控整流电路的matlab仿真,基于Matlab的单相桥式全控整流电路的仿真研究...
  19. 接地电阻测试仪使用方法讲解
  20. GoPro fusion(双目) Vr视频如何导出至手机和PC端(Win)

热门文章

  1. MFC之CString与const char* string 转换
  2. 【第一章】MySQL数据概述
  3. 225 Implement Stack using Queues(用队列实现栈Medium)
  4. python gui 选择
  5. 验证采集[Python]代理抓取并验证-多线程
  6. Excel develop
  7. oracle01144,ORA-01144
  8. 安川e7变频器接线_台达变频器C2000系列在铝箔纸压花机上的应用
  9. java jdom进行xml的增删改差_java使用DOM对XML文档进行增删改查操作实例代码
  10. openGauss凝聚创新力量,云和恩墨MogDB加速社区发展