簡體   English   中英

自定義約束驗證器注釋未執行

[英]Custom Constraint Validator Annotation Not Being Executed

經過大量的瀏覽之后,在SO上瀏覽,閱讀文章並嘗試了許多事情,由於某種原因,我在基於Spring的Web服務應用程序中的自定義約束沒有觸發。 我似乎無法弄清楚這一點,因此我正在調查觀眾。

我正在使用Jetty 9.2.2.v20140723。 Spring 4.3.13,Hibernate 5.3.0-FINAL。 以下是我的文件。 在這一點上,我正在嘗試實現跨參數驗證。 這個例子很簡單:如果兩個參數不相等,則驗證失敗。 文件:

package com.xxx.yyy;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import com.xxx.validator.ValuesValidator;

public interface IGetValues {

   @Path("/{value1}/{value2}")
   @GET
   @ValuesValidator
   public MyResponse getValues(@PathParam("value1") String value1, @PathParam("value2") String value2);

}

下一個:

package com.xxx.yyy;

import org.springframework.stereotype.Component;
import com.xxx.validator.ValuesValidator;

@Component
public class GetValuesImpl implements IGetValues {

  @Override
  @ValuesValidator
  public MyResponse getValues(String value1, String value2) {
    return new MyResponse();
  }
}

下一個:

package com.xxx.yyy.validator;

import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraintvalidation.SupportedValidationTarget;


@Target({METHOD, CONSTRUCTOR, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = ValuesValidatorImpl.class)
@Documented
@SupportedValidationTarget(ValidationTarget.PARAMETERS)

public @interface ValuesValidator {
 String message() default "The two values don't match";
 Class<?>[] groups() default {};
 Class<? extends Payload>[] payload() default {};
}

下一個:

package com.xxx.yyy.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;


@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class ValuesValidatorImpl implements 
   ConstraintValidator<ValuesValidator, Object[]> {

    @Override
    public void initialize(ValuesValidator valuesValidator) {

    }

    @Override
    public boolean isValid(Object[] values, ConstraintValidatorContext constraintValidatorContext) {

      String val1 = (String) values[0];
      String val2 = (String) values[1];

      return val1.equals(val2);
   }
}

我正在使用PostMan獲取URL:

http://localhost:9086/path/v1/values/A/B

由於“ A”不是“ B”,因此我應該拋出驗證異常和某種“ You Suck!”。 回碼。 沒有運氣。

該服務被很好地調用,並且我從MyResponse得到了預期的響應。 但是,驗證器沒有被解雇。 那是肯定的。 我使用了System.outs,斷點等。這只是沒有發生。

一個消息來源說要創建一個@Configuration類,並向其添加一個@Bean getter,它返回一個ValuesValidatorImpl對象。 試過了,沒有用。 我將其添加到在我的applicationContext.xml文件中也聲明的component-scan包中。

有什么建議嗎? 這次似乎沒有發生“在示例中效果很好”的情況。

更新 :我將我的問題發布到了Jetty用戶列表中,一名成員要求提供可用的示例實施問題。 在Github上,所以我有義務。 要重現問題行為,請參閱:

https://github.com/mcc99/samples/tree/master/customer-validator

與IntelliJ IDEA社區一起開發,並包括一個Maven .pom文件,用於輕松進行依賴項檢查和檢索。

並在此先感謝您決定要解決的任何滑動。 我很難相信這是一個尚未浮出水面的問題,所以我不得不想象自己做錯了什么/缺少了什么。 另請注意,我嘗試了最新版本。 碼頭和有問題的行為繼續。

您必須在目標bean上添加注釋@Validated。

import org.springframework.validation.annotation.Validated;

//..
@Component
@Validated
public class GetValuesImpl implements IGetValues {

否則,此bean將不會附加您提供的定制驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM