【问题标题】:Custom Datetime validation not working in Rest自定义日期时间验证在 Rest 中不起作用
【发布时间】:2018-10-17 10:02:35
【问题描述】:

我创建了一个自定义日期验证器来检查时间戳字符串,如下所示。代码工作正常,但验证不起作用,响应正文中没有显示任何消息。

当我发布如下数据时

{
  "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;
            }
        }
    }
}

【问题讨论】:

  • 是否没有检查任何验证注释,或者只是没有检查您的自定义验证器?
  • @JanRieke no....即使我从请求正文中获取timestamp,它也没有验证并给我 200

标签: java spring rest validation lombok


【解决方案1】:

您的createStock 方法需要一个BindingResult bindingResult 参数。使用它来检查验证错误:

if (bindingResult.hasErrors()) {
    // return error or throw exception
}

【讨论】:

  • 感谢您的回复.....但我们不能在控制器中使用任何符合客户要求的逻辑
  • 验证逻辑仍在自定义验证器中。控制器只需要检查是否有错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
相关资源
最近更新 更多