我有以下代码:
资源:
@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)
)。如何动态地将此类属性添加到验证器?
如果可以修改 Dto 以接受 id(比如说 timeZoneId)作为有效负载字段而不是 PathParam,我们可以在验证器中注入 Service 来获取 timeZone
Service#getTimeZone(int id)
。然后我们可以使用 ZoneId 获取该区域的当前日期时间
ZoneId zoneId = service.getTimeZone(dto.getTimeZoneId());
LocalDateTime now = LocalDateTime.now(zoneId);