如何在 JSON 请求中的未知字段上抛出错误以 Spring Restapi



我有一个Spring rest api,它可以获取json数据并绑定到pojo GetData。每当我收到未知字段时,它都不会失败或引发任何异常。我在这里的要求是,当它在 json 数据中收到未知字段时,它应该抛出错误。

public ResponseEntity<Error> saveLocation(@Valid @RequestBody GetData getdata,BindingResult bindingResults) {

下面是我的Pojo GetData

public class GetData{
@JsonProperty("deviceID")
@Pattern(regexp="^[\p{Alnum}][-\p{Alnum}\p{L}]+[\p{Alnum}]$",message = "Not a valid Device Id")
private String deviceID;

@JsonProperty("Coordinates")
@Pattern(regexp="^[\p{Alnum}\-][\.\,\-\_\p{Alnum}\p{L}\s]+|",message = "Coordinates are not valid")
private String coordinates;}

下面是我的 json 请求。

{
"deviceID" : "01dbd619-843b-4197-b954",
"Coordinates" : "12.984012,80.246712",
}

现在,如果我发送带有额外字段的请求,请说国家/地区。它不会抛出任何错误。

{
    "deviceID" : "01dbd619-843b-4197-b954",
    "Coordinates" : "12.984012,80.246712",
    "country" : "dsasa"
}

请建议如何在 json 请求中发送未知属性的错误

您可以尝试以下任何一种实现,它对我有用。您必须从ResponseEntityExceptionHandler或使用 ExceptionHandler 覆盖另一种方法。

1. 通过覆盖响应实体异常处理程序的方法

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

@ControllerAdvice
public class CustomExceptionHandler extends ResponseEntityExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(CustomExceptionHandler.class);
    //Other Handlers
    // Handle 400 Bad Request Exceptions
    @Override
    protected ResponseEntity<Object> handleHttpMessageNotReadable(HttpMessageNotReadableException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        log.info(ex.getLocalizedMessage() + " ",ex);
        final CustomErrorMessage errorMessage = new CustomErrorMessage(ex.getLocalizedMessage(), InfoType.ERROR, HttpStatus.BAD_REQUEST, ex.fillInStackTrace().toString());
        return handleExceptionInternal(ex, errorMessage, headers, errorMessage.getStatus(), request);
    }
    //Other Handlers
}

除了上面的实现之外,您还可以尝试下面的实现,如果您只想在请求有效负载或空属性中存在无法识别的属性并且存在空值时才抛出错误,如下所示JSON

   {
     "":""
   }

2. 使用异常处理程序

import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class GenericExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GenericExceptionHandler.class);
    @ExceptionHandler(value = {UnrecognizedPropertyException.class})
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    protected ResponseEntity<Object> handleUnrecognizedPropertyException(UnrecognizedPropertyException ex) {
        log.info(ex.getLocalizedMessage() + " ",ex);
        final String error = "JSON parse error: Unrecognized field " + "[ " + ex.getPropertyName() + " ]";
        final CustomErrorMessage errorMessage = new CustomErrorMessage(error, InfoType.ERROR, HttpStatus.BAD_REQUEST);
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorMessage);
    }
}

注意:要使上述两种实现正常工作,您需要在application.properties文件中添加以下行。

spring.jackson.deserialization.fail-on-unknown-properties=true

希望这对你有所帮助:)

您需要

配置ObjectMapper来处理此类情况:

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);

或者,您可以使用:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = false)
public class GetData {
}

相关内容

最新更新