拦截创建RequestBody的请求

时间:2020-06-06 15:32:03

标签: java spring spring-boot validation spring-mvc

我有一个基本的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;
        }
    }

在我看来,这确实很麻烦,并且无法扩展到将来的父子关系,我的问题是,有没有办法拦截此请求以创建此子类并将其传递给控制器​​或一些内置验证,处理这种情况?

谢谢!

1 个答案:

答案 0 :(得分:0)

您尝试过吗:

import com.google.cloud.MetadataConfig;

String instanceId = MetadataConfig.getInstanceId();

所有映射和验证均自动完成

相关问题