将 @Validation 应用于入站控制器 POJO 的 micronaut 未验证
micronaut applying @Validation to inbound controller POJO(s) doesn't validate
鉴于此控制器方法。
import io.micronaut.validation.Validated;
...
@Validated
@Get(value = "test{?page*}", produces = APPLICATION_JSON)
public HttpResponse<TransactionListResponseDto> get(
PageDto page) {
Sort sort = Pageable.from(page.getPage(), page.getSize(), sortFrom(page.getSort()));
return HttpResponse.ok();
}
和看起来像这样的 PageDto。
import javax.validation.constraints.Min;
...
@Getter
@Setter
@Introspected
@JsonInclude(NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class PageDto {
@Min(1)
private int page = 1;
private int size = 10;
private String sort;
}
并且必要的验证包含在 gradle 文件中。
implementation "io.micronaut:micronaut-validation:$micronautVersion"
implementation "io.micronaut.beanvalidation:micronaut-hibernate-validator:$micronautVersion"
我期待控制器方法验证参数,但我很高兴传入(例如)-100
作为页码,尽管有验证属性。
继 documentation and advice.
我必须得出结论,我错过了构建步骤或其他什么?
通过@Valid
注解对page
参数进行注解,指示Micronaut使用嵌套验证:
@Get(value = "test{?page*}", produces = APPLICATION_JSON)
public HttpResponse<TransactionListResponseDto> get(@Valid PageDto page) {
...
return HttpResponse.ok();
}
那么它会像这样:
$ curl http://localhost:8080/test?page=-100
{
"message": "page.page: must be greater than or equal to 1",
"_links": {
"self": {
"href": "/test?page=-100",
"templated": false
}
}
}
如果您的项目中有 Micronaut 数据,那么您可以使用现有的 io.micronaut.data.model.Pageable
界面进行分页,并将其直接传递到存储库 类。在这种情况下,您的方法可能如下所示:
@Get(value = "test", produces = APPLICATION_JSON)
public HttpResponse<Page<ItemOverview>> get(@Valid Pageable pageable) {
return HttpResponse.ok(someRepository.findAll(pageable))
}
鉴于此控制器方法。
import io.micronaut.validation.Validated;
...
@Validated
@Get(value = "test{?page*}", produces = APPLICATION_JSON)
public HttpResponse<TransactionListResponseDto> get(
PageDto page) {
Sort sort = Pageable.from(page.getPage(), page.getSize(), sortFrom(page.getSort()));
return HttpResponse.ok();
}
和看起来像这样的 PageDto。
import javax.validation.constraints.Min;
...
@Getter
@Setter
@Introspected
@JsonInclude(NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class PageDto {
@Min(1)
private int page = 1;
private int size = 10;
private String sort;
}
并且必要的验证包含在 gradle 文件中。
implementation "io.micronaut:micronaut-validation:$micronautVersion"
implementation "io.micronaut.beanvalidation:micronaut-hibernate-validator:$micronautVersion"
我期待控制器方法验证参数,但我很高兴传入(例如)-100
作为页码,尽管有验证属性。
继 documentation and advice.
我必须得出结论,我错过了构建步骤或其他什么?
通过@Valid
注解对page
参数进行注解,指示Micronaut使用嵌套验证:
@Get(value = "test{?page*}", produces = APPLICATION_JSON)
public HttpResponse<TransactionListResponseDto> get(@Valid PageDto page) {
...
return HttpResponse.ok();
}
那么它会像这样:
$ curl http://localhost:8080/test?page=-100
{
"message": "page.page: must be greater than or equal to 1",
"_links": {
"self": {
"href": "/test?page=-100",
"templated": false
}
}
}
如果您的项目中有 Micronaut 数据,那么您可以使用现有的 io.micronaut.data.model.Pageable
界面进行分页,并将其直接传递到存储库 类。在这种情况下,您的方法可能如下所示:
@Get(value = "test", produces = APPLICATION_JSON)
public HttpResponse<Page<ItemOverview>> get(@Valid Pageable pageable) {
return HttpResponse.ok(someRepository.findAll(pageable))
}