>  기사  >  Java  >  Spring Boot 프로젝트의 매개변수 확인 방법

Spring Boot 프로젝트의 매개변수 확인 방법

PHPz
PHPz앞으로
2023-05-15 13:58:171602검색

장면 복원

간단한 비즈니스 시나리오 시뮬레이션:

현재 점수 입력 시스템을 작업하고 있다면 Spring Boot 프레임워크를 사용하여 프런트엔드에서 전달된 Student 개체를 수신하기 위한 배경 인터페이스를 작성할 수 있습니다. browser 를 사용하여 백엔드 데이터베이스에 삽입합니다.

수신되는 Student 개체를 다음과 같이 정의합니다.

public class Student {
    private String name;    // 姓名
    private Integer score;  // 考试分数(满分100分)
    private String mobile;  // 电话号码(11位)
}

그런 다음 웹 페이지에서 전달된 Student 개체를 수신하기 위한 Post request 백엔드 인터페이스를 작성합니다.

@RestController
public class TestController {

    @Autowired
    private StudentService studentService;

    @PostMapping("/add")
    public String addStudent( @RequestBody Student student ) {
        studentService.addStudent( student ); // 将student对象存入数据库
        return "SUCCESS";
    }
}

이제 위 내용을 보셨을 것 같습니다. 들어오는 Student 개체에 대해 데이터 확인을 수행하지 않았기 때문에 code에 허점이 있습니다. 예:

Student 개체의 세 필드 중 하나가 잊혀졌는데 null인 경우 어떻게 해야 합니까? ? 학생의 점수가 잘못 표기되어 101점으로 표기된다면 어떻게 되나요? 학생의 휴대전화번호 11자리를 잘못 입력하여 한 자리를 더 추가하면 어떻게 해야 하나요? ...잠깐

이러한 데이터는 일반적으로 프런트 엔드 페이지에서 검증되지만 엄격하고 성실한 백엔드 개발 엔지니어로서 우리는 전달되는 모든 데이터에 대해 엄격한 검증을 수행해야 합니다. 테스트 , 그럼 우리는 무엇을 써야 할까요?

@PostMapping("/add")
public String addStudent( @RequestBody Student student ) {
    if( student == null )
        return "传入的Student对象为null,请传值";
    if( student.getName()==null || "".equals(student.getName()) )
        return "传入的学生姓名为空,请传值";
    if( student.getScore()==null )
        return "传入的学生成绩为null,请传值";
    if( (student.getScore()<0) || (student.getScore()>100) )
        return "传入的学生成绩有误,分数应该在0~100之间";
    if( student.getMobile()==null || "".equals(student.getMobile()) )
        return "传入的学生电话号码为空,请传值";
    if( student.getMobile().length()!=11 )
        return "传入的学生电话号码长度有误,应为11位";
    studentService.addStudent( student ); // 将student对象存入MySQL数据库
    return "SUCCESS";
}

글을 다 썼는데

손이 좀 아프고 마음도 좀 피곤하네요 이 학생 개체는 결국 안에 3개의 필드만 있으면 어떨까요. 개체에 30개의 필드가 있습니까? 상상할 수 없습니다! 신의 주석 축복

사실 Spring 프레임워크는 다양한 대화형

데이터 검증

작업을 편리하게 제공하기 위해 아주 초기 버전부터 annotations를 사용해 왔습니다. 예를 들어 위의 예에서는 해당하는 추가 작업만 수행하면 됩니다. 들어오는 Student 엔터티 클래스의 필드에 대한 주석을 사용하면 문제를 쉽게 해결할 수 있습니다.

public class Student {
    @NotNull(message = "传入的姓名为null,请传值")
    @NotEmpty(message = "传入的姓名为空字符串,请传值")
    private String name;    // 姓名

    @NotNull(message = "传入的分数为null,请传值")
    @Min(value = 0,message = "传入的学生成绩有误,分数应该在0~100之间")
    @Max(value = 100,message = "传入的学生成绩有误,分数应该在0~100之间")
    private Integer score;  // 分数

    @NotNull(message = "传入的电话为null,请传值")
    @NotEmpty(message = "传入的电话为空字符串,请传值")
    @Length(min = 11, max = 11, message = "传入的电话号码长度有误,必须为11位")
    private String mobile;  // 电话号码
}
물론 동시에 들어오는 Student 개체 작업을 확인할 수 있도록 개체 입구에 @Valid 주석도 추가해야 합니다.

@PostMapping("/add")
public String addStudent( @RequestBody  @Valid Student student ) {
    // 棒棒哒!原先各种繁杂的参数校验工作统统都省了!一行代码不用写
    studentService.addStudent( student ); // 将student对象存入MySQL数据库
    return "SUCCESS";
}

이때 특정 필드에 오류가 입력되면(예: 데이터 전송 시 학생 점수가 실수로 101점으로 전송됨) 인터페이스에서 반환된 결과에 오류 세부 정보가 표시됩니다.

Spring Boot 프로젝트의 매개변수 확인 방법물론 이 문제의 원리는 Annotation을 사용하기 때문에 Java에 대한 다양한 Reflection과 기타 지식을 활용하여 구현한 것입니다. 관심 있는 친구들은 이번 기회에 공부해 보세요!

데이터 변칙의 균일한 차단

주석을 사용한 위의 통합 데이터 검증 방법은 매우 좋다고 생각됩니다

. 그러나 유일한 단점은 반환된

결과가 너무 복잡하고, 반드시 필요한 형식이 아닐 수도 있다는 것입니다. 해야 합니다 통합 처리, 예를 들어 특정 매개변수 확인에 대한 오류 메시지를 파헤쳐 프런트 엔드로 반환하고 싶습니다. 이를 위해 프로젝트에 대한 전역 통합 예외 인터셉터

를 구성하여 모든 데이터 검증의 반환 결과 형식을 지정합니다.

@ControllerAdvice
@ResponseBody
public class GlobalExceptionInterceptor {
  @ExceptionHandler(value = Exception.class)
  public String exceptionHandler(HttpServletRequest request, Exception e) {
    String failMsg = null;
    if (e instanceof MethodArgumentNotValidException) {
      // 拿到参数校验具体异常信息提示
      failMsg = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
    }
    return failMsg; // 直接吐回给前端
  }
}
위 코드에서 볼 수 있듯이 매개변수 확인 예외인 MethodArgumentNotValidException을 전역적으로 가로채서 해당 예외에 해당하는 자세한 메시지 정보만 가져와서 프런트엔드로 내보냈습니다. 프런트 엔드가 훨씬 더 명확해졌습니다.

위 내용은 Spring Boot 프로젝트의 매개변수 확인 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제