2011-06-09 21 views
15

Bir dize, ek açıklama kullanarak bir değerler kümesine göre doğrulamak istiyorum. İstediğim şey temelde buJava Enum değerleri ve ek açıklama kullanarak dize doğrulaması

@ValidateString(enumClass=com.co.enum) 
String dataType; 

int maxValue; 
int minValue; 
int precision; 

veya

@ValidateString(values={"String","Boolean", "Integer"}) 
String dataType; 

int maxValue; 
int minValue; 
int precision; 

Ben de dataType ayarlanan değere bağlı olarak diğer değişkenlerin bazı doğrulama yapmak istiyorum

,

if (dataType = "String ") maxValue, minValue, kesinlik tümü sıfır veya sıfır olmalıdır.

Özel ek açıklamalarla bunu başarmanın bir yolunu düşünemiyorum. . .

Biri bana

+0

gerçek "iş" ihtiyaç nedir ÇOK KOLAY? Bu çözmeye çalışan nedir? (Gerçekten de bu tam olarak bir şey yapmanıza gerek yok - bu sadece bir şey yapmanın bir yoludur) – Bohemian

cevap

16

Yaptığım şey budur.

Ek Açıklama

public @interface ValidateString { 

    String[] acceptedValues(); 

    String message() default "{uk.dds.ideskos.validator.ValidateString.message}"; 

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

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

Doğrulama Sınıf

public class StringValidator implements ConstraintValidator<ValidateString, String>{ 

    private List<String> valueList; 

    @Override 
    public void initialize(ValidateString constraintAnnotation) { 
     valueList = new ArrayList<String>(); 
     for(String val : constraintAnnotation.acceptedValues()) { 
      valueList.add(val.toUpperCase()); 
     } 
    } 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
     if(!valueList.contains(value.toUpperCase())) { 
      return false; 
     } 
     return true; 
    } 

} 

Ve Şimdi yani şartlı onay nasıl uygulanacağı anlamaya ihtiyacımız

@ValidateString(acceptedValues={"Integer", "String"}, message="Invalid dataType") 
String dataType; 

Long maxValue; 
Long minValue; 

gibi kullandı. Dize sonra maxValue ve minValue boş veya Sıfır olması gerekir ..

Herhangi bir fikir?

+0

En büyük dezavantaj, enum değiştiğinde, bu notun hızlı bir şekilde unutulmasıdır. Bunu enum'un değerleriyle eşlemek için bir yol yok mu? –

8

Hendek dize temsilini yardımcı olabilir ve gerçek enum yapın.

public enum DataType { 
    STRING, 
    BOOLEAN, 
    INTEGER; 
} 

Hiç enum olup olmadığını belirlemek için önceki String dataType değişkenin dize karşılaştırma yapmak zorunda önlemek Bu şekilde. Bir kenara göre, dataType üye değişkeni için geçerli olmayan bir değer atamayı imkansız kılar ve enumlar sınıf yükleyicide singleton olarak garanti edildiğinden, bellek izi de kaydedilir.

Kodunuzu değiştirmek için kodunuzu değiştirme çabalarına değer. Ancak, yapamayacağınızı varsayarak, en azından açıklamaları kullanmak için ek açıklamaları değiştirebilirsiniz.

@ValidateString(DataType.STRING) String dataType; 

ve ValidateString açıklama en azından kodun kalanı olmasa bile, çeteleler yararlanma alır bu şekilde.

Artık bir numaralandırma kullanamayacağınız son derece nadir şansta, her kabul edilen değeri eşleştiren statik genel tam sayıları ayarlayabilirsiniz. Ek açıklamalarda parametresi için bir dize kullanırsanız

public class DataType { 
    public static final int STRING = 1; 
    public static final int BOOLEAN = 2; 
    ... 
} 

Ancak, sadece belirli değerler izin verildiğini belirtmek için türü içine uzanan bir tür kontrol sistemi yok.

public int<values=[1,3,5,7..9]> oddInt; 

Eğer

oddInt = 4; 

Bu neden önemlidir atamaya çalıştık ederseniz bir hata olacaktır: Başka bir deyişle, Java böyle bir şey yapmak yeteneğinden mahrum? Çünkü normal Java için geçerli değilse, normal Java sınıflarında uygulanan numaralandırma için geçerli olamaz.

+0

"Dize gösterimini boşalt ve gerçek bir numara yap." Bu gerçekten kullanıcı giriş onaylaması için en kötü öneridir ... Örneğin bir http isteği ile, kullanıcı her zaman bir dize gönderir. Değer yanlışsa, kullanıcı doğru bir ileti almayı umuyor (örneğin, dataType bilinen herhangi bir değerle eşleşmiyor.) ... ve engerçek değeri –

+0

olan basit bir statik yöntemle oluşacak 400 BAD TALEPİ değil enum 'valueForString (...)' Enum değerini döndürür, yoksa hiç değilse (örneğin yazım hatası nedeniyle). Girişin onaylanmasını merkezileştirir ve girdilerin tanımlandığı yerde yapar. Ve aşırı dramatik olamayalım. Her ikisi de daha kötü tavsiyelerde bulunabileceğimiz için bu en kötü tavsiye değildir. –

9

Yani burada kod Bahar doğrulamayı olmak ve benim için harika çalışıyor olduğunu. Tam kod aşağıda verilmiştir. Yukarıdaki sınıfın

import java.lang.annotation.Documented; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.validation.Constraint; 
import javax.validation.Payload; 
import javax.validation.ReportAsSingleViolation; 
import javax.validation.constraints.NotNull; 

@Documented 
@Constraint(validatedBy = EnumValidatorImpl.class) 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
@NotNull(message = "Value cannot be null") 
@ReportAsSingleViolation 
public @interface EnumValidator { 

    Class<? extends Enum<?>> enumClazz(); 

    String message() default "Value is not valid"; 

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

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

} 

Uygulama: YUKARIDAKİ AÇIKLAMALARIYLA OF

import java.util.ArrayList; 
import java.util.List; 

import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 

public class EnumValidatorImpl implements ConstraintValidator<EnumValidator, String> { 

    List<String> valueList = null; 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
    if(!valueList.contains(value.toUpperCase())) { 
     return false; 
    } 
    return true; 
    } 

    @Override 
    public void initialize(EnumValidator constraintAnnotation) { 
    valueList = new ArrayList<String>(); 
    Class<? extends Enum<?>> enumClass = constraintAnnotation.enumClazz(); 

    @SuppressWarnings("rawtypes") 
    Enum[] enumValArr = enumClass.getEnumConstants(); 

    for(@SuppressWarnings("rawtypes") 
    Enum enumVal : enumValArr) { 
     valueList.add(enumVal.toString().toUpperCase()); 
    } 

    } 

} 

KULLANIMI

@JsonProperty("lead_id") 
    @EnumValidator(enumClazz=DefaultEnum.class,message="This error is coming from the enum class", groups = {Group1.class }) 
    private String leadId; 
+0

Harika çözüm .. –

+1

Merhaba Gruplar nerede başlatıldı? – Sofiane