SpringBoot verwendet @Validated nicht mehr zur Parameterüberprüfung, aber was soll ich tun, wenn ich nicht auf der Controller-Ebene sein möchte?

Inhaltsverzeichnis

Szenenwiedergabe:

Wie es geht?

Was ist das Problem?

Wie erreicht man es?


Szenenwiedergabe:

Eine API-Schnittstelle akzeptiert verschlüsselte JSON-Strings. Nach dem Empfang der Strings wird zunächst die Entschlüsselung durchgeführt. Nach Abschluss der Entschlüsselung ist eine Parameterüberprüfung erforderlich. Wenn die Parameter nicht den Spezifikationen entsprechen, wird direkt eine Eingabeaufforderungsmeldung zurückgegeben.

Wie es geht?

Wir können durchaus zufriedenstellend sein, indem wir zuerst die Zeichenfolge auf der Controller-Ebene akzeptieren, sie dann entschlüsseln und dann die Parameter auf der Service-Ebene überprüfen. Hier liegt jedoch ein Problem vor, das heißt, die entschlüsselte JSON-Zeichenfolge wird zu einem Objekt und dann Es gibt jedoch Dutzende von Feldern. Wenn Sie zur Überprüfung die normale Methode verwenden, benötigt jeder Parameter eine if-Anweisung, was schrecklich wäre! ! Daher denke ich darüber nach, Validated zu verwenden, um mich bei der Parameterüberprüfung zu unterstützen.

Was ist das Problem?

Das Problem besteht darin, dass wir normalerweise die validierte Parameterüberprüfung direkt auf der Controller-Ebene verwenden, wie zum Beispiel hier.

    @PostMapping("/resume-info")
    public ResponseResult<String>
    insertResumeInfo(@Validated(ValidatedGroup.Insert.class) @RequestBody ResumeMainInfoDTO dto) {
        return resumeInfoService.InsertInfo(dto);
    }
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResumeMainInfoDTO {

    @NotBlank(message = "!",groups = ValidatedGroup.Update.class)
    private Long id;

    /**
     * 姓名
     */
    @Length(max = 20,message ="!",groups = ValidatedGroup.Select.class)
    @NotBlank(message = "!",groups = ValidatedGroup.Insert.class)
    @NotBlank(message = "!",groups = ValidatedGroup.Update.class)
    private String userName;
}

Ich verwende die gleiche Methode für den Service, aber sie funktioniert nicht. Was sollen wir also mit der Serviceschicht machen?

Wie erreicht man es?

Die Controller-Schicht akzeptiert String-Parameter und wandelt sie in Objekte um



    @Autowired
    ss service;
    
@PostMapping("/getJson")
    public ResponseResult<String>  getJson(@RequestBody String dto) {
        RequestDTO requestDTO = JSON.parseObject(dto, RequestDTO.class);
        return service.startTask(requestDTO);
    }

 Service-Layer-Schnittstelle

    public ResponseResult<String> startTask(@Valid @RequestBody RequestDTO dto);

Schnittstellenimplementierung

@Validated
在当前类的头上加上  

  @Override
    public ResponseResult<String> startTask(@Valid @RequestBody  RequestDTO dto) {
// 校验完成后的其他代码        
return start(dto);
    }

Ok, oben ist der Schlüsselcode, das Folgende ist nicht kritisch

Achten Sie auf den entscheidenden Teil

1 Fügen Sie @Validated zur Service-Layer-Klasse hinzu

2 Fügen Sie @Valid @RequestBody vor dem zu überprüfenden Objekt hinzu (beachten Sie, dass sowohl die Schnittstelle als auch die Implementierung der Schnittstelle vorhanden sein müssen).

3 Verwenden Sie im Controller die Injektionsmethode zum Aufrufen

4 Definieren Sie die Beurteilungsprüfung in dto

-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------

Teil des DTO-Codes

    @Length(min = 1, max = 6, message = "申请类型不合法!提示:xx")
    String approve_type;
    // xx
    Integer port_type;

    @NotNull(message = "创建人id不能为空!")
//    @Range(min = 1,message = "创建人id不能为空!")
    Long create_user_id;
    @Length(max = 32, message = "创建人名称过长!")
    String create_user_name;

globale Ausnahmebehandlung

// 1:使用PathVariable并且是get请求的参数错误。
    // 2:使用RequestParam并且是from-data方式提交的post请求的参数错误。
    @ExceptionHandler(value = ConstraintViolationException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorResult handleBindGetException(ConstraintViolationException e) {
        log.error("{}", e.getMessage(), e);
        List<String> defaultMsg = e.getConstraintViolations()
                .stream()
                .map(ConstraintViolation::getMessage)
                .collect(Collectors.toList());
        return Params_Common_Res(defaultMsg);
    }


    // 错误情况:
    //1 使用了ResponseBody并且是json数据类型的post请求
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error("{}", e.getMessage(), e);
        List<String> defaultMsg = e.getBindingResult().getFieldErrors()
                .stream()
                .map(fieldError -> "【" + fieldError.getField() + "】" + fieldError.getDefaultMessage())
                .collect(Collectors.toList());
        return Params_Common_Res(defaultMsg);
    }

    /**
     * 兼容Validation校验框架:忽略参数异常处理器
     */
    @ExceptionHandler(value = MissingServletRequestParameterException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorResult handleMissingServletRequestParameterException(MissingServletRequestParameterException e) {
        log.error("{}", e.getMessage(), e);
        log.error("ParameterName: {}", e.getParameterName());
        log.error("ParameterType: {}", e.getParameterType());
        return Params_Common_Res();
    }

    // 前端并没有提交必要的参数信息
    @ExceptionHandler(HttpMessageNotReadableException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorResult error(HttpMessageNotReadableException e){
        log.error("{}", e.getMessage(), e);
        return ErrorResult.build(new ErrorResult( false,ErrorEnum.Params_Lack_Err.getMessage(),ErrorEnum.Params_Lack_Err.getCode()), e.getMessage());
    }

Wirkung:

 

Ich denke du magst

Origin blog.csdn.net/qq_53679247/article/details/131280759
Empfohlen
Rangfolge