Пользовательская проверка даты и времени не работает в покое - PullRequest
0 голосов
/ 17 октября 2018

Я создал специальный валидатор даты для проверки строки метки времени, как показано ниже.Код работает нормально, но проверка не работает, и в теле ответа не отображается сообщение.

Когда я публикую данные, как показано ниже

{
  "price": "0",
  "timestamp": "foo foo"
}

, это дает мне 200Мое исключение - получить действительные сведения об исключении.Может кто-нибудь, пожалуйста, помогите мне в этом

StockController.java

@RestController
@AllArgsConstructor
@RequestMapping(value = "/stock", produces = MediaType.APPLICATION_JSON_VALUE)
public class StockController {

    @Autowired
    private StockService stockService;

    @PostMapping
    public void createStock(@Valid @RequestBody final Stock stock) {
        stockService.create(stock);
    }
}

DefaultControllerAdvice.java

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class DefaultControllerAdvice {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Exception handleException(Exception exception){
        return exception;
    }
}

Stock.java

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

import com.challenge.validators.TimestampValidator;

import lombok.Data;

    @Data
    public class Stock {

        @Min(0)
        @NotNull
        public double price;

        @NotNull(message="Timestamp cannot be empty")
        @DateTimeValidator
        public String timestamp;
    }

DateTimeValidator.java

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = DateTimeValidatorCheck.class)
@Documented
public @interface DateTimeValidator {

    String message() default "Must be timestamp of format YYYY-MM-DDThh:mm:ss.sssZ";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

DateTimeValidatorCheck.java

public class DateTimeValidatorCheck implements ConstraintValidator<DateTimeValidator, String> {

    @Override
    public void initialize(DateTimeValidator dateTimeValidator ) {
    }

    @Override
    public boolean isValid(String timestamp, ConstraintValidatorContext context) {
        if (timestamp == null) {
            return false;
        } else {
            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
            try {
                LocalDate.parse(timestamp, dateTimeFormatter);
                return true;
            } catch (DateTimeParseException dateTimeParseException) {
                return false;
            }
        }
    }
}

1 Ответ

0 голосов
/ 17 октября 2018

Вам нужен параметр BindingResult bindingResult в вашем методе createStock.Используйте это для проверки ошибок валидации:

if (bindingResult.hasErrors()) {
    // return error or throw exception
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...