Blog Entry
Quarkus自定义校验错误信息
Quarkus自定义校验错误信息
- Created
- 2023/08/02
- Updated
- 2023/08/02
环境
> java -versionopenjdk version "11.0.19" 2023-04-18OpenJDK 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 --versionApache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f)
> quarkus -version3.2.2.Final方式一
POM依赖
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-validator</artifactId></dependency>添加错误消息文件
resources/ValidationMessages.properties
# @Lengthorg.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// -> MessageInterpolatorpublic class KsMessageInterpolator extends ResourceBundleMessageInterpolator { public KsMessageInterpolator() { super(new PlatformResourceBundleLocator("i18n/validation")); }}这样,就可以用resources/i18n/validation.properties来代替ValidationMessages.properties了
方式三
基于方式二,在自定义的extension里面也可以达到这个效果:
runtime
定义一个Recorder:
@Recorderpublic 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了