2016-10-20 143 views
1

我在@RestController的@GET方法中編寫了一個自定義驗證來驗證ID(這是一個路徑參數)作爲UUID,但此驗證看起來沒有工作。即使在調試過程中,控件也不會進行自定義驗證。自定義註釋驗證在@pathParam在春天沒有驗證

@RestController 
    @RequestMapping("/rateplan") 
    @Validated 
    public class RatePlanServiceController { 

    @RequestMapping(value = "/{ratePlanId}", method = RequestMethod.GET) 
    @ResponseStatus(HttpStatus.OK) 
    public void get(@UUID @PathVariable("ratePlanId") String ratePlanId) { 

     loggerFactory.warn("Get with Rate plan id {}", ratePlanId); 
     loggerFactory.info("Get with Rate plan id {}", ratePlanId); 
     loggerFactory.error("Get with Rate plan id {}", ratePlanId); 
     loggerFactory.debug("Get with Rate plan id {}", ratePlanId); 

     // return iRatePlanService.getRatePlan(ratePlanId); 
    } 
} 

我編寫了用於驗證UUID的自定義註釋,如下所示。

import org.springframework.stereotype.Component; 

import javax.validation.Constraint; 
import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 
import javax.validation.Payload; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 
import java.util.regex.Pattern; 

@Target(ElementType.PARAMETER) 
@Constraint(validatedBy = {UUID.IdValidator.class}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface UUID { 
    String message() default "{invalid.uuid}"; 

    Class<?>[] groups() default {}; 

    Class<? extends Payload>[] payload() default {}; 

    @Component 
    public class IdValidator implements ConstraintValidator<UUID, String> { 


     private static final Pattern id_PATTERN = 
       Pattern.compile("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"); 

     public boolean isValid(String value, ConstraintValidatorContext context) { 

      if (!(id_PATTERN.matcher(value).matches())) { 
       return false; 
      } 

      return true; 
     } 

     public void initialize(UUID parameters) { 

     } 

    } 
} 

任何人都可以讓我知道爲什麼它不工作。即使我提供像'345%#7^34'這樣的垃圾收費標準,它也可以進入GET方法。

回答

1

通過在應用程序配置文件中添加一個bean解決了這個問題。爲了驗證Spring中的Param參數,你需要在你的配置類中添加這個bean。

@Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); }

+0

很重要的一提的是,如果你的「@RestController」不與「@Validated」註明,簡單地創建這種「@Bean」仍然是行不通的。 – martin