环境
> 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
了