Skip to content

Commit

Permalink
docs: 优化web-docs,补充页面内容
Browse files Browse the repository at this point in the history
  • Loading branch information
stick-i committed Aug 27, 2024
1 parent fe25a27 commit c7695d6
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 94 deletions.
3 changes: 3 additions & 0 deletions document/web-docs/docs/.vuepress/configs/navbar/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ export const navbarZh: NavbarOptions = [
children: [
'/guide/introduction.md',
'/guide/getting-started.md',
'/guide/user-guide.md',
'/guide/spel.md',
'/guide/custom.md',
],
},
{
Expand Down
25 changes: 3 additions & 22 deletions document/web-docs/docs/.vuepress/configs/sidebar/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,9 @@ export const sidebarZh: SidebarOptions = {
children: [
'/guide/introduction.md',
'/guide/getting-started.md',
],
},
],
'/advanced/': [
{
text: '深入',
children: [
'/advanced/architecture.md',
'/advanced/plugin.md',
'/advanced/theme.md',
],
},
{
text: 'Cookbook',
children: [
'/advanced/cookbook/README.md',
'/advanced/cookbook/usage-of-client-config.md',
'/advanced/cookbook/adding-extra-pages.md',
'/advanced/cookbook/making-a-theme-extendable.md',
'/advanced/cookbook/passing-data-to-client-code.md',
'/advanced/cookbook/markdown-and-vue-sfc.md',
'/advanced/cookbook/resolving-routes.md',
'/guide/user-guide.md',
'/guide/spel.md',
'/guide/custom.md',
],
},
],
Expand Down
52 changes: 52 additions & 0 deletions document/web-docs/docs/guide/custom.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# 自定义约束注解

如果你使用过 `javax.validation` 的自定义约束注解,那么你会发现 `SpEL Validator` 的自定义约束注解几乎与 `javax.validation`
一致。

下面以 `@SpelNotNull` 为例,展示如何实现自定义约束注解。

## 创建约束注解类

```java
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = SpelNotNullValidator.class)
public @interface SpelNotNull {

String message() default "{javax.validation.constraints.NotNull.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String condition() default "";
}
```
## 创建约束验证器
```java
public class SpelNotNullValidator implements ConstraintValidator<SpelNotNull, Object> {
private String condition;
@Override
public void initialize(SpelNotNull constraintAnnotation) {
this.condition = constraintAnnotation.condition();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
if (StringUtils.hasText(condition)) {
return SpelUtils.evaluate(condition, value, Boolean.class);
}
return true;
}
}
```
13 changes: 8 additions & 5 deletions document/web-docs/docs/guide/getting-started.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 快速开始

- 支持JDK8+

## 添加依赖

Latest Version:
Expand Down Expand Up @@ -29,7 +31,7 @@ Latest Version:

## 添加启动注解

在接口参数上使用 `@Valid``@Validated` 注解
在接口参数上对需要进行校验的类使用 `@Valid``@Validated` 注解

```java
@RestController
Expand All @@ -47,9 +49,9 @@ public class ExampleController {
}
```

## 添加约束注解
## 添加SpEL约束注解

在实体类上使用 `@SpelValid` 注解,同时在需要校验的字段上使用 `@SpelNotNull` 等约束注解
在实体类上使用 `@SpelValid` 注解,表示开启校验,同时在需要校验的字段上使用 `@SpelNotNull` 等约束注解

```java
@Data
Expand All @@ -60,7 +62,8 @@ public class SimpleExampleParamVo {
private Boolean switchAudio;

/**
* 当 switchAudio 为 true 时,校验 audioContent,audioContent 不能为null
* 此处开启了注解校验
* 当 switchAudio 字段为 true 时,校验 audioContent,audioContent 不能为null
*/
@SpelNotNull(condition = "#this.switchAudio == true", message = "语音内容不能为空")
private Object audioContent;
Expand All @@ -70,7 +73,7 @@ public class SimpleExampleParamVo {

## 处理异常

添加异常处理器,处理校验异常
添加全局异常处理器,处理校验不通过的异常信息

```java
@RestControllerAdvice
Expand Down
71 changes: 4 additions & 67 deletions document/web-docs/docs/guide/introduction.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# 介绍

SpEL Validator 是基于 Spring Expression Language 的参数校验包,也是 javax.validation 的扩展增强包,用于简化参数校验,几乎支持所有场景下的参数校验。
SpEL Validator 是基于 Spring Expression Language 的参数校验包,也是 javax.validation 的扩展增强包,用于简化参数校验,它几乎支持所有场景下的参数校验。

设计的初衷是为了解决一些需要判断另一个字段的值来决定当前字段是否校验的场景。

::: tip

本组件的目的不是代替 `javax.validation` 的校验注解,而是作为一个扩展,方便某些场景下的参数校验。

原则上来说,能够使用 `javax.validation` 处理的场景就不要使用 `spel-validator`
原则上来说,能够使用 `javax.validation` 处理的场景就不应该使用 `spel-validator`

:::

Expand Down Expand Up @@ -50,68 +52,3 @@ Test
```

- 更多使用场景,欢迎探索和补充!

## 📖 使用指南

> 注意:本组件的目的不是代替 `javax.validation` 的校验注解,而是作为一个扩展,方便某些场景下的参数校验。
> 能够使用 `javax.validation` 的场景就不要使用 `spel-validator` ,因为 `spel-validator` 会有一定的性能损耗。
### 开启约束校验

需要满足以下两个条件,才会对带注解的元素进行校验:

1. 在接口参数上使用 `@Valid``@Validated` 注解
2. 在实体类上使用 `@SpelValid` 注解

如果只满足第一个条件,那么只会对带 `@NotNull``@NotEmpty``@NotBlank` 等注解的元素进行校验。

如果只满足第二个条件,那么不会对任何元素进行校验。

这是因为 `@SpelValid` 注解是基于 `javax.validation.Constraint` 实现的,只有在 `@Valid``@Validated` 注解的支持下才会生效。
`spel-validator` 提供的约束注解是基于 `@SpelValid` 进行扫描校验的,只有在 `@SpelValid` 注解生效的情况下才会执行约束校验。

### 使用约束注解

目前支持的约束注解有:

| 注解 | 说明 | 对标 javax.validation |
|:---------------:|:---------------:|:-------------------:|
| `@SpelAssert` | 逻辑断言校验 ||
| `@SpelNotNull` | 非 null 校验 | `@NotNull` |
| `@SpelNotEmpty` | 集合、字符串、数组大小非空校验 | `@NotEmpty` |
| `@SpelNotBlank` | 字符串非空串校验 | `@NotBlank` |
| `@SpelNull` | 必须为 null 校验 | `@Null` |
| `@SpelSize` | 集合、字符串、数组长度校验 | `@Size` |

每个约束注解都包含三个默认的属性:

- `message`:校验失败时的提示信息。
- `group`:分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。
- `condition`:约束开启条件,支持 SpEL 表达式,当 表达式为空 或 计算结果为true 时,才会对带注解的元素进行校验。

### 调用 Spring Bean

默认情况下,解析器无法识别 SpEL 表达式中的 Spring Bean。

如果需要在 SpEL 表达式中调用 Spring Bean,需要在启动类上添加 `@EnableSpelValidatorBeanRegistrar` 注解,
开启 Spring Bean 支持。

```java

@EnableSpelValidatorBeanRegistrar
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}
```

### 自定义约束注解

参考 `cn.sticki.validator.spel.SpelConstraint` 类,实现自定义约束注解。

如果你使用过 `javax.validation` 的自定义约束注解,那么你会发现 `SpEL Validator` 的自定义约束注解几乎与 `javax.validation`
一致。
5 changes: 5 additions & 0 deletions document/web-docs/docs/guide/spel.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# SpEL 表达式

暂时没写

可以先看看官方文档:[Spring Expression Language (SpEL)](https://docs.spring.io/spring-framework/reference/core/expressions.html)
69 changes: 69 additions & 0 deletions document/web-docs/docs/guide/user-guide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# 使用指南

::: tip

本组件的目的不是代替 `javax.validation` 的校验注解,而是作为一个扩展,方便某些场景下的参数校验。

原则上来说,能够使用 `javax.validation` 处理的场景就不应该使用 `spel-validator`

:::

## 开启约束校验

需要满足以下两个条件,才会对带注解的元素进行校验:

1. 在接口参数上使用 `@Valid``@Validated` 注解
2. 在实体类上使用 `@SpelValid` 注解

如果只满足第一个条件,那么只会对带 `@NotNull``@NotEmpty``@NotBlank` 等注解的元素进行校验。

如果只满足第二个条件,那么不会对任何元素进行校验。

这是因为 `@SpelValid` 注解是基于 `javax.validation.Constraint` 实现的。
这就意味着,`@SpelValid``@NotNull``@NotEmpty``@NotBlank` 等注解一样,
需要在 `@Valid``@Validated` 注解的支持下才会生效。

`spel-validator` 提供的约束注解又是在 `@SpelValid` 的内部进行校验的,只有在 `@SpelValid` 注解生效的情况下才会执行约束校验。

所以,如果需要使用 `spel-validator` 进行校验,需要同时满足上述两个条件。

## 使用约束注解

目前支持的约束注解有:

| 注解 | 说明 | 对标 javax.validation |
|:---------------:|:---------------:|:-------------------:|
| `@SpelAssert` | 逻辑断言校验 | `@AssertTrue` |
| `@SpelNotNull` | 非 null 校验 | `@NotNull` |
| `@SpelNotEmpty` | 集合、字符串、数组大小非空校验 | `@NotEmpty` |
| `@SpelNotBlank` | 字符串非空串校验 | `@NotBlank` |
| `@SpelNull` | 必须为 null 校验 | `@Null` |
| `@SpelSize` | 集合、字符串、数组长度校验 | `@Size` |
| `@SpelMin` | 即将支持 | `@Min` |
| `@SpelMax` | 即将支持 | `@Max` |

所有约束注解都包含三个默认的属性:

- `message`:校验失败时的提示信息。
- `group`:分组条件,支持 SpEL 表达式,当分组条件满足时,才会对带注解的元素进行校验。
- `condition`:约束开启条件,支持 SpEL 表达式,当 **表达式为空****计算结果为true** 时,才会对带注解的元素进行校验。

## 调用 Spring Bean

默认情况下,解析器无法识别 SpEL 表达式中的 Spring Bean。

如果需要在 SpEL 表达式中调用 Spring Bean,需要在启动类上添加 `@EnableSpelValidatorBeanRegistrar` 注解,
开启 Spring Bean 支持。

```java

@EnableSpelValidatorBeanRegistrar
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}
```

0 comments on commit c7695d6

Please sign in to comment.