如何在日期jsondeserializer中捕获自定义的执行?

发布于 2025-02-03 04:27:16 字数 3132 浏览 1 评论 0原文

IMPARINALAION:IM试图以Date Format的消息为 date Gormat date offece date格式如果错误。但是,即使我输入错误的格式,自定义异常也不会显示,但是有错误400不良请求,并且我使用exception捕获所有错误。



import java.io.IOException;
import java.time.LocalDate;

import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;


import com.cartgatewayservice.RestModelException.DATE_FORMAT_EXCEPTION;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

public class DateDeserializer extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
        
        DateTimeFormatter localDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        
        String dateValue = p.getValueAsString();
        

        try {
            
              LocalDate localDate = LocalDate.parse(dateValue, localDateFormatter);
              return convertToDateViaInstant(localDate);
          
        } catch (Exception e) {
              throw new DATE_FORMAT_EXCEPTION("Date format is wrong");
        }
    
    }
    
      public Date convertToDateViaInstant(LocalDate dateToConvert) {
            return Date.from(dateToConvert.atStartOfDay()
                    .atZone(ZoneId.systemDefault())
                    .toInstant());
        }
    


}





import java.util.Date;

import com.cartgatewayservice.BodyConvertParameters.DateDeserializer;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.OptBoolean;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import org.springframework.format.annotation.DateTimeFormat;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
public class ProductEntity {
    

  
    
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING, lenient = OptBoolean.FALSE)
   @JsonDeserialize(using = DateDeserializer.class)
    private Date productexpirationdate;

}

public class DATE_FORMAT_EXCEPTION extends RuntimeException  {

    private static final long serialVersionUID = 1L;
    
    public DATE_FORMAT_EXCEPTION(String message) {
        super(message);
    }
}

@ControllerAdvice
public class RestAdviceException extends ResponseEntityExceptionHandler {


    @ExceptionHandler(DATE_FORMAT_EXCEPTION.class)
    public ResponseEntity<Object>  handleFormatDateEntity(DATE_FORMAT_EXCEPTION ex, WebRequest request) {
        return new ResponseEntity<Object>(new ERROR_DETAILS_EXCEPTION(ex.getMessage(), HttpStatus.BAD_REQUEST, LocalDateTime.now()),HttpStatus.NOT_FOUND);
        
    ..........
    }

}

Implementaion: Im trying to show the customize exception DATE_FORMAT_EXCEPTION with a message of Date format is wrong if error. But even i input a wrong format the customize exception wont show but there is error 400 Bad Request and i use Exception which catch all the error.



import java.io.IOException;
import java.time.LocalDate;

import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;


import com.cartgatewayservice.RestModelException.DATE_FORMAT_EXCEPTION;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

public class DateDeserializer extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
        
        DateTimeFormatter localDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        
        String dateValue = p.getValueAsString();
        

        try {
            
              LocalDate localDate = LocalDate.parse(dateValue, localDateFormatter);
              return convertToDateViaInstant(localDate);
          
        } catch (Exception e) {
              throw new DATE_FORMAT_EXCEPTION("Date format is wrong");
        }
    
    }
    
      public Date convertToDateViaInstant(LocalDate dateToConvert) {
            return Date.from(dateToConvert.atStartOfDay()
                    .atZone(ZoneId.systemDefault())
                    .toInstant());
        }
    


}





import java.util.Date;

import com.cartgatewayservice.BodyConvertParameters.DateDeserializer;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.OptBoolean;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

import org.springframework.format.annotation.DateTimeFormat;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;


@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
public class ProductEntity {
    

  
    
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    @JsonFormat(pattern = "yyyy-MM-dd", shape = JsonFormat.Shape.STRING, lenient = OptBoolean.FALSE)
   @JsonDeserialize(using = DateDeserializer.class)
    private Date productexpirationdate;

}

public class DATE_FORMAT_EXCEPTION extends RuntimeException  {

    private static final long serialVersionUID = 1L;
    
    public DATE_FORMAT_EXCEPTION(String message) {
        super(message);
    }
}

@ControllerAdvice
public class RestAdviceException extends ResponseEntityExceptionHandler {


    @ExceptionHandler(DATE_FORMAT_EXCEPTION.class)
    public ResponseEntity<Object>  handleFormatDateEntity(DATE_FORMAT_EXCEPTION ex, WebRequest request) {
        return new ResponseEntity<Object>(new ERROR_DETAILS_EXCEPTION(ex.getMessage(), HttpStatus.BAD_REQUEST, LocalDateTime.now()),HttpStatus.NOT_FOUND);
        
    ..........
    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文