D+支持Spring Boot哪些版本?
- D+ 2.2.x 支持 Spring boot 2.4.x
- D+ 2.3.x 支持 Spring boot 2.5.x
IAM的后端代码在哪里?
IAM的后端基础代码由devtools自动生成
- 配置好D+组件依赖和devtools依赖
- 启动项目,进入devtools的组件初始化页面,选择core及IAM等组件,执行初始化
- devtools将生成IAM基础的代码到你配置的路径下
如何自定义jackson配置
core-starter中包含默认的HttpMessageConverters配置,启用jackson并做了初始化配置。 其中关键配置参数为:
@Bean
@ConditionalOnMissingBean
public HttpMessageConverters jacksonHttpMessageConverters() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = converter.getObjectMapper();
// Long转换成String避免JS超长问题
SimpleModule simpleModule = new SimpleModule();
// 不显示为null的字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
// 时间格式化
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setDateFormat(new SimpleDateFormat(D.FORMAT_DATETIME_Y4MDHMS));
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
// 设置格式化内容
converter.setObjectMapper(objectMapper);
HttpMessageConverter<?> httpMsgConverter = converter;
return new HttpMessageConverters(httpMsgConverter);
}如果该配置无法满足您的开发场景,可以在Configuration文件中重新定义HttpMessageConverters:
@Bean
public HttpMessageConverters jacksonHttpMessageConverters() {
...
}引入diboot-core-starter后,SQL分页查询出现重复的LIMIT
LIMIT ? LIMIT ?重复定义了分页导致的,diboot-core-starter默认预置了mybatis-plus的分页配置(使用mybatis-plus 3.4.x的MybatisPlusInterceptor最新配置方式)。 如果您依赖的是core-starter,则无需再次配置mybatis-plus的分页,将您自定义的mybatis-plus分页配置删掉即可。 如果需要添加其他Interceptor,则需要重新定义MybatisPlusInterceptor。 示例如下:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}mybatis-plus老项目中想要使用diboot的绑定能力?或在无数据库连接配置文件的module下,使用diboot-core?
对于没有历史包袱的新项目,我们建议您全使用diboot体系starter组件。 core内核组件有以下两个包:
- core: 内核代码
- core-starter: 依赖core,增加了自动配置及初始化字典表等功能(需要依赖数据库信息)。
对于mybatis-plus老项目中想要使用D+的绑定能力 或 在无数据库连接配置文件的module下,使用内核组件,可以只依赖core,而不是core-starter。 步骤如下:
- 添加core依赖(非core-starter)
<dependency>
<groupId>com.diboot</groupId>
<artifactId>diboot-core</artifactId>
<version>{latestVersion}</version>
</dependency>- 如果只依赖core,你还需要将com.diboot.core加入包扫描并实现HttpMessageConverters和Mybatis-plus的分页配置:
@ComponentScan(basePackages={"com.diboot.core"})
@MapperScan(basePackages = {"com.diboot.core.mapper"})- 如果只依赖core,且需要使用@BindDict字典绑定,需实现DictionaryServiceExtProvider接口。 (使用diboot-core-starter可以自动创建dictionary表,或者可以下载SQL (opens new window)手动建表。
启动报错:找不到mapper中的自定义接口
devtools默认不指定mapper.xml路径时,mapper.xml文件会生成到mapper同路径下便于维护。 此时需要修改pom配置,让编译包含xml、dtd类型文件。
- Maven配置:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.dtd</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>- Gradle配置:
sourceSets {
main {
resources {
srcDirs "src/main/java"
include '**/*.xml'
include '**/*.dtd'
include '**/*.class'
}
resources {
srcDirs "src/main/resources"
include '**'
}
}
}如何构建树形结构?
树形结构对象约定:要有 parentId属性(根节点为0) 和 List children 属性,便于自动构建。
- 先把需要构建树形结构的节点全部查出来,如:
List<Menu> menus = menuService.getEntityList(wrapper);- 调用BeanUtils.buildTree构建树形结构
// 如果children属性在VO中,可以调用BeanUtils.convertList转换后再构建
menus = BeanUtils.buildTree(menus);返回第一级子节点集合。
查询Date类型日期范围,如何自动绑定?
使用Comparison. GE,Comparison. LT进行绑定,避免数据库转型。
/**
* 创建时间-起始
*/
@BindQuery(comparison = Comparison.GE, field = "createTime")
private Date createTimeBegin;
/**
* 创建时间-截止(截止时间<=当天23:59:59是不精确的,应该是<第二天)
*/
@BindQuery(comparison = Comparison.LT, field = "createTime")
private Date createTimeEnd;
public TodoRemider setCreateTimeEnd(Date createTimeEnd) {
this.createTimeEnd = D.nextDay(createTimeEnd);
return this;
}查询Date类型日期时间字段 = 某天,如何自动绑定?
建议逻辑: datetime_field >= beginDate AND datetime_field < (beginDate+1) 。 无函数处理,不涉及数据库类型转换。示例:
/**
* 创建时间-起始
*/
@BindQuery(comparison = Comparison.GE, field = "createTime")
private Date createTime;
/**
* 创建时间-截止
*/
@BindQuery(comparison = Comparison.LT, field = "createTime")
private Date createTimeEnd;
public Date getCreateTimeEnd() {
return D.nextDay(createTime);
}如何在新建时自动填充创建人、创建时间、更新时间等字段
- 创建时间、更新时间首选采用数据库填充方式实现
- 如需代码自动填充的字段,可通过Mybatis-plus的MetaObjectHandler自动填充, 具体请参考mybatis-plus文档 (opens new window)。 示例: 注解标记填充字段:
class MyEntity {
@TableField(fill = FieldFill.INSERT)
private Long createBy;
...
}实现填充Handler:
@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
BaseLoginUser currentUser = IamSecurityUtils.getCurrentUser();
if(currentUser != null){
this.strictInsertFill(metaObject, Cons.FieldName.createBy.name(), Long.class, currentUser.getId());
}
}
...
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName(Cons.FieldName.updateTime.name(), new Date(), metaObject);
}
}如何配置swagge
以swagger3的maven配置为例:
步骤1. pom中引入swagger3依赖
<!-- swagger3 配置 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>步骤2. 添加swagger配置类
// 示例配置类
@Configuration
@EnableOpenApi
public class SwaggerConfig {
@Bean
public Docket docket(){
return new Docket(DocumentationType.OAS_30)
//apiInfo: 添加api描述信息
.apiInfo(apiInfo()).enable(true)
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("XX项目接口文档")
.description("XX描述")
.contact(new Contact("作者", "作者地址", "作者邮箱"))
.version("1.0")
.build();
}
}步骤1&2为swagger的正常配置,如果引入了diboot IAM组件,需要添加以下配置使swagger相关url可以匿名访问。
步骤3. 设置swagger相关的匿名url配置,使swagger不被拦截, 如下:
#swagger 3.x版本参考配置
diboot:
iam:
anon-urls: /swagger**/**,/webjars/**,/v3/**,/doc.html
# swagger 2.x版本参考配置
# anon-urls:/swagger-ui.html,/swagger-resources/**,/webjars/**,/v2/api-docs/**另外,如果启用了diboot devtools,可以配置devtools生成代码启用swagger注解。
diboot:
devtools:
enable-swagger: true提示
附: swagger访问入口地址:
- swagger 3.x入口地址: /{contextPath}/swagger-ui/index.html
如何启用多租户
diboot的系统表均预留了多租户字段 tenant_id ,启用 Mybatis-plus的租户拦截器 (opens new window)即可启用多租户能力。
启用方式:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 建议严格遵循以下顺序添加拦截器
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 租户拦截器(可选)
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
return new LongValue(0);
}
// 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件
@Override
public boolean ignoreTable(String tableName) {
return "iam_account".equalsIgnoreCase(tableName) || S.startsWithIgnoreCase(tableName, "diboot_");
}
}));
// 数据权限拦截器(可选)
interceptor.addInnerInterceptor(new DataAccessControlInteceptor());
// 分页拦截器,需保证 add PaginationInnerInterceptor 在最后
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}