我有一个基本的CreateRequest类,该类在几个孩子中继承,每个孩子负责一些自定义验证:
基础:
public class CreateEventRequest {
@NotEmpty
private String name;
@NotNull
@JsonProperty
private Boolean isPrivate;
}
孩子:
public class CreateRegularEventRequest extends CreateEventRequest {
@NotNull
@Future
private LocalDateTime startTime;
@NotNull
@Future
private LocalDateTime endTime;
public LocalDateTime getStartTime() {
return startTime;
}
public LocalDateTime getEndTime() {
return endTime;
}
}
为了利用验证,我尝试了以下方法:
@PostMapping(value = "/", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<CreateEventResponse> createEvent(HttpEntity<String> httpEntity,
@AuthenticationPrincipal SecuredUser user) {
try {
CreateEventRequest eventRequest = eventRequestFactory.getEventRequestString(httpEntity.getBody());
Set<ConstraintViolation<CreateEventRequest>> violations = validator.validate(eventRequest);
if (!violations.isEmpty()) {
throw new ConstraintViolationException(violations);
}
return new ResponseEntity<>(this.service.createEvent(eventRequest, user), HttpStatus.CREATED);
} catch (ConstraintViolationException e) {
throw e;
} catch (Exception e) {
return ResponseEntity.badRequest().build();
}
}
我的工厂是:
public CreateEventRequest getEventRequestString(String json) {
try {
String eventTypeRaw = new ObjectMapper().readTree(json)
.get("event_type").asText();
if (!StringUtils.isEmpty(eventTypeRaw)) {
EventType eventType = EventType.valueOf(eventTypeRaw);
if (EventType.REGULAR.equals(eventType)) {
return objectMapper.readValue(json, CreateRegularEventRequest.class);
} else if (EventType.RECURRING.equals(eventType)) {
return objectMapper.readValue(json, CreateRecurringEventRequest.class);
}
}
return null;
} catch (JsonProcessingException e) {
return null;
}
}
在我看来,这确实很麻烦,并且无法扩展到将来的父子关系,我的问题是,有没有办法拦截此请求以创建此子类并将其传递给控制器或一些内置验证,处理这种情况?
谢谢!
答案 0 :(得分:0)
您尝试过吗:
import com.google.cloud.MetadataConfig;
String instanceId = MetadataConfig.getInstanceId();
所有映射和验证均自动完成