在对象验证中使用特定属性

问题描述 投票:0回答:1

我有以下代码:

资源:

@Component
@RequiredArgsConstructor
public class Resource {

  private final Service service;

  @POST
  @Path("/{id}/create")
  @Consumes(MediaType.APPLICATION_JSON)
  @Produces(MediaType.APPLICATION_JSON)
  public Response create(@PathParam("id") int id, @Valid @NotNull final Dto dto) {
    return Response.ok(service.save(id, dto)).build();
  }

A Dto:

@Getter
@Future
@AllArgsConstructor
@NoArgsConstructor
public class Dto {

  @NotNull
  private LocalDateTime start;

  @NotNull
  private LocalDateTime end;

}

验证者:

@Component
@AllArgsConstructor
public class FutureValidator implements ConstraintValidator<Future, Dto> {

  @Override
  public boolean isValid(final Dto dto, final ConstraintValidatorContext constraintValidatorContext) {
    return dto.getStart().isAfter(LocalDateTime.now()) && dto.getEnd().isAfter(dto.getStart());
  }

}

问题是我需要将

start
与自定义时区中的
LocalDateTime
进行比较,这还取决于从服务调用中检索的外部属性 (
Service#getTimeZone(int id)
)。如何动态地将此类属性添加到验证器?

java spring-boot validation
1个回答
0
投票

如果可以修改 Dto 以接受 id(比如说 timeZoneId)作为有效负载字段而不是 PathParam,我们可以在验证器中注入 Service 来获取 timeZone

Service#getTimeZone(int id)
。然后我们可以使用 ZoneId 获取该区域的当前日期时间

    ZoneId zoneId = service.getTimeZone(dto.getTimeZoneId());
    LocalDateTime now = LocalDateTime.now(zoneId);
© www.soinside.com 2019 - 2024. All rights reserved.