我創建了一個注釋,該注釋具有檢查輸入的字串是否為空或指定的值等功能。但注釋不起作用。我認為它不會對 DTO 進行任何驗證。我做錯了什么?我還在控制器上添加了有效的注釋。我認為 isValid() 函式不起作用。
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.PARAMETER;
@Documented
@Constraint(validatedBy = {SpecificStringValueValidator.class})
@Target( {PARAMETER} )
@Retention(RetentionPolicy.RUNTIME)
public @interface SpecificStringValue {
//This annotation ensures input is not null and contains no empty strings
//Also applies maximum minimum control if specified
//Checks if the input is of length value given.
int value() default 0;
int min() default -9999;
int max() default -9999;
String message() default "Invalid String";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Objects;
public class SpecificStringValueValidator implements ConstraintValidator<SpecificStringValue,String> {
private SpecificStringValue specificValue;
private boolean status = false;
@Override
public void initialize(SpecificStringValue specificValue) {
ConstraintValidator.super.initialize(specificValue);
this.specificValue = specificValue;
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
String str = s;
String noSpaceStr = str.replaceAll("\\s", "");
//This if block work if it is requested to have a certain length.
if(specificValue.value() != 0){
//Check does the string contain a space character?
if(noSpaceStr.length() == s.length() && s.isEmpty() && s.length() == specificValue.value()){
status = true;
}
}
//If there is no specific value, it checks the max min.
else {
//Check does the string contain a space character?
if(noSpaceStr.length() == s.length() && s.isEmpty() ){
//Check the minimum number
if(specificValue.min() != -9999){
if(s.length() >= specificValue.min()){
status = true;
}
}
//Check the maximum number
if(specificValue.max() != -9999){
if(s.length() <= specificValue.max()){
status = true;
}
}
}
}
return status;
}
}
public record CreateSellerRequestDTO(
@SpecificStringValue(value = 5,message = "Username cant be null") userName){}
@PostMapping
public ResponseEntity<?> create(@RequestBody @Valid CreateSellerRequestDTO createSellerRequestDTO){
sellerService.create(createSellerRequestDTO);
return ResponseEntity.ok().build();
}
uj5u.com熱心網友回復:
Record 類實際上是自動生成的類,具有不可變欄位和每個欄位的 getter 樣式方法。你怎么知道注釋@SpecificStringValue
放在哪里(在方法或欄位上)?
注釋的目標只是PARAMETER
所以我懷疑注釋沒有傳播到欄位(用戶名),這將觸發驗證。您至少應該嘗試將METHOD
和添加FIELD
到注釋目標
uj5u.com熱心網友回復:
嘗試將org.springframework.boot:spring-boot-starter-validation
依賴項添加到您的專案中。
順便說一句,您的方法存在多個問題isValid()
-您沒有考慮輸入字串是null
并且似乎使用s.isEmpty()
而不是!s.isEmpty()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/480985.html
下一篇:返回列表