2013-12-03 6 views
2

У меня возникла проблема запуска пользовательской проверки ограничений на трикотаж. Я хотел бы активировать ограничение на метод или статический метод. То, что я пробовал, это добавить пользовательскую аннотацию и @ValidateOnExecution поверх метода, но пользовательский класс проверки еще не был запущен.Список проверки бобов <?> по статическому методу или геттерам

@LocationIsValid 
@ValidateOnExecution 
public static List<Double> getLocation(String location) { 
    ... 
} 

Я подозревал, что проблема боба аннотации не поддерживает статический метод, поэтому я удалил статическое ключевое слово и получить доступ к методу, создавая новый объект. Однако пользовательский механизм проверки LocationIsValid не был активирован.

В результате я положил завод валидатора для проверки этой переменной вручную.

public static List<Double> getLocation(String location) { 
    ... 
    // split the location string into a list of double 
    ... 
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 
    validator = factory.getValidator(); 
    validator.validate(location, LocationIsValid.class); 
} 

Но все же пользовательские ограничения не сдвинутся с места. Я надеюсь, что кто-то может дать мне понять, что делать дальше, или другое предложение по решению этой проблемы.

Подробнее

Он работает должным образом, когда аннотаций находится на верхней части поля ресурсов.

public class Product { 

    ... 

    @LocationIsValid 
    private List<Double> location; 

    ... 

} 

Обновлено

Даже я изменил метод к обычному методу экземпляра, он по-прежнему не работает. Обратите внимание, что у меня есть два перегруженных метода: один - это ресурс, другой - для преобразования строки в локации.

Модель продукта

public class Product { 

@Id 
@JsonSerialize(using = ObjectIdSerializer.class) 
private ObjectId id; 
@Size(min = 5) 
private String name; 
@NotNull 
@LocationIsValid 
private List<Double> location; 

private Date dateCreated; 

private Date dateModified; 

public Product() { 

} 

public List<Double> getLocation() { 
    return location; 
} 

@ValidateOnExecution 
@LocationIsValid 
public List<Double> getLocation(String location) { 
    String[] locationString = location.split(";"); 

    if (locationString.length != 2) { 
     return null; 
    } 

    List<Double>locations = new ArrayList<Double>(); 
    for (int i = 0; i < locationString.length; i++) { 
     locations.add(Double.parseDouble(locationString[i])); 
    } 
    return locations; 
} 


// Other setters getters 

} 

ресурс продукта

@GET 
public ProductList getProducts(@QueryParam("near") String location) { 
    // parse the locations variable 
    Product product = new Product(); 
    // did not work 
    // I have placed a breakpoint on the LocationIsValid 
    List<Double> locations = product.getLocation(location); 
} 

Примечание: Я уверен, что проблема не находится в LocationIsValid, как это работает правильно, когда я подтверждено его в качестве субъекта @Valid Product product я являюсь используя Джерси 2.4.1 с проверкой майнинга-бина 2.4.1 зависимость

+0

Являются ли другие ограничения работоспособными? – chrylis

+0

он работает правильно, когда аннотация помещается в поле, которое является переменной ресурса. – Lunayo

ответ

0

Проблема в том, что я фактически не вызывал валидатор, используя @Valid в объекте Product в контроллере. Причина в том, что мне нужно только проверить переменную местоположения, а не весь объект Product. Поэтому я предполагаю, что единственный способ решить эту проблему - вызвать фабрику валидатора программно внутри функции ресурса. Обратите внимание, что причина, по которой я не успел проверить свойство с использованием валидатора, - это потому, что я никогда не вызываю правильный метод. Ниже приведен код, который использует фабрику валидации для проверки определенного свойства в объекте ресурса.

@GET 
public ProductList getProducts(@QueryParam("near") String location) { 
    // parse the locations variable 
    List<Double> locations = Product.getLocation(location); 
    // validate the value 
    Set<ConstraintViolation<Product>> constraints = Validation 
    .buildDefaultValidatorFactory() 
    .getValidator() 
    .validateValue(Product.class, "location", locations, Default.class); 
    if (locations == null || locations.size() != 2 
     || constraints.size() > 0) { 
     throw new ConstraintViolationException(constraints); 
    } 
} 

Если у кого-то есть лучшие идеи или предложения по обходу этой проблемы, сообщите мне об этом.

0

Как вы говорите, проверка статических методов не поддерживается Bean Vali dation спецификация. Однако валидация методов экземпляра должна работать, можете ли вы опубликовать весь код ресурса JAX-RS? Является ли getLocation() на этом ресурсе? JAX-RS должен инициировать проверку ограничений метода (будь то ограничение параметра или возвращаемого значения) в методах классов ресурсов.

+0

Да, у меня есть два метода getLocation(), один для ресурса, другой - для синтаксического анализа. Я обновил вопрос. – Lunayo

+0

Я предполагаю, что проблема заключается в том, что метод не запускался вообще в первый раз, потому что он работает, когда я устанавливаю его как '@Valid Product product'. Но как я могу проверить только конкретный метод? – Lunayo

Смежные вопросы