Skip to main content

Quarkus自定义校验错误信息

· 2分钟阅读

环境

> java -version
openjdk version "11.0.19" 2023-04-18
OpenJDK Runtime Environment GraalVM CE 22.3.2 (build 11.0.19+7-jvmci-22.3-b18)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.2 (build 11.0.19+7-jvmci-22.3-b18, mixed mode, sharing)

> mvn --version
Apache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f)

> quarkus -version
3.2.2.Final

方式一

POM依赖

<dependency>  
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-validator</artifactId>
</dependency>

添加错误消息文件

resources/ValidationMessages.properties

# @Length
org.hibernate.validator.constraints.Length.message = 长度区间 {min} and {max}

使用

@Path("/demo")  
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class DemoResource {

@GET
@Operation(summary = "Get Demo")
public Response get(@Length(min=2, max=20) String name) {
return Response.ok(JsonObject.of("name", name)).build();
}
}

方式二

有时候需要自己规划配置文件位置和名字,而这个ValidationMessages.properties固定的。

quarkus里面,提供了一种方式,如果提供了jakarta.validation.MessageInterpolator,会被自动注入到ValidatorFactory中,像这样:

// KsMessageInterpolator 
// -> ResourceBundleMessageInterpolator
// -> AbstractMessageInterpolator
// -> MessageInterpolator
public class KsMessageInterpolator extends ResourceBundleMessageInterpolator {
public KsMessageInterpolator() {
super(new PlatformResourceBundleLocator("i18n/validation"));
}
}

这样,就可以用resources/i18n/validation.properties来代替ValidationMessages.properties

方式三

基于方式二,在自定义的extension里面也可以达到这个效果:

runtime

定义一个Recorder

@Recorder  
public class KsServerRecorder {

public Supplier<MessageInterpolator> messageInterpolatorSupplier() {
return () -> new ResourceBundleMessageInterpolator(
new PlatformResourceBundleLocator("i18n/validation"));
}
}

deployment

增加一个BuildStep

@BuildStep  
@Record(ExecutionTime.STATIC_INIT)
SyntheticBeanBuildItem registerMessageInterpolator(KsServerRecorder ksServerRecorder) {
return SyntheticBeanBuildItem.configure(MessageInterpolator.class)
.scope(Singleton.class)
.supplier(ksServerRecorder.messageInterpolatorSupplier())
.done();
}

这样,引用的项目也可以用resources/i18n/validation.properties来代替ValidationMessages.properties

参考