2016-12-15 2 views
0

Я хочу ввести зависимость в пользовательскую функцию проверки пружинных модулей. Я попытался использовать @Autowired на сеттер, но он не имеет никакого эффекта. Кто-нибудь знает, если и как это можно сделать?Как я могу ввести зависимость в пользовательскую функцию проверки валидации Spring (Valang)?

Вот мой valang валидатор:

<bean id="resellerValidator" class="org.springmodules.validation.valang.ValangValidator"> 
    <property name="customFunctions"> 
     <map> 
     <entry key="isValidResellerId" value="com.myproject.valang.IsValidResellerIdFunction" /> 
     </map> 
    </property> 
    <property name="valang"> 
     <value> 
     <![CDATA[ 
      {resellerId: ? IS BLANK OR isValidResellerId(?) IS TRUE : '' : 'field.badFormat'} 
     ]]> 
     </value> 
    </property> 
</bean> 

А вот пользовательская функция:

public class IsValidResellerIdFunction extends AbstractFunction { 

    private ResellerService resellerService; 

    @Autowired 
    public void setResellerService(ResellerService resellerService) { 
     this.resellerService = resellerService; 
    } 

    public IsValidResellerIdFunction(Function[] arguments, int line, int column) { 
     super(arguments, line, column); 
     definedExactNumberOfArguments(1); 
    } 

    @Override 
    protected Object doGetResult(Object o) throws Exception { 
     String resellerId = (String) getArguments()[0].getResult(o); 
     return resellerService.isValidResellerId(resellerId); 
    } 

} 

ответ

0

Я на самом деле попал найти ответ here. Таким образом, необходимо было 2 вещи:

  1. Создайте компонент FunctionWrapper и введите мою собственную функцию в оболочку с областью действия = «прототип». Это позволяет мне вставлять любую зависимость, которую я хочу в свою пользовательскую функцию.
  2. Внедрите интерфейс ConfigurableFunction, чтобы он работал с FunctionWrapper.

FunctionWrapper автоматически не обнаруживаемый все valang валидаторов, поэтому нет необходимости объявлять пользовательскую функцию в явном виде со свойством customFunction, а имя функции является только именем боба вы даете FunctionWrapper:

<bean id="resellerValidator" class="org.springmodules.validation.valang.ValangValidator"> 
    <property name="valang"> 
     <value> 
     <![CDATA[ 
      {resellerId: ? IS BLANK OR isValidResellerId(?) IS TRUE : '' : 'field.badFormat'} 
     ]]> 
     </value> 
    </property> 
</bean> 

<bean id="isValidResellerId" 
     class="org.springmodules.validation.valang.functions.FunctionWrapper" 
     scope="prototype"> 
    <aop:scoped-proxy/> 
    <property name="function"> 
     <bean id="isValidResellerIdFunction" 
       class="com.myproject.valang.IsValidResellerIdFunction" 
       scope="prototype"> 
      <property name="resellerService" ref="resellerService"/> 
     </bean> 
    </property> 
</bean> 

функция:

public class IsValidResellerIdFunction extends AbstractFunction implements ConfigurableFunction { 

    private ResellerService resellerService; 

    public void setResellerService(ResellerService resellerService) { 
     this.resellerService = resellerService; 
    } 

    public IsValidResellerIdFunction() {} 

    @Override 
    public int getExpectedNumberOfArguments() { 
     return 1; 
    } 

    @Override 
    public void setArguments(int expectedNumberOfArguments, Function[] arguments, 
      int line, int column) { 
     super.setTemplate(line, column); 
     super.setArguments(arguments); 
     super.definedExactNumberOfArguments(expectedNumberOfArguments); 
    } 

    @Override 
    protected Object doGetResult(Object o) throws Exception { 
     String resellerId = (String) getArguments()[0].getResult(o); 
     return resellerService.isValidResellerId(resellerId); 
    } 

} 
0

Добавить это в контекст приложения:

<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/> 
+0

Спасибо за ответ, но это не имело никакого эффекта. –

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