Spring MVC - не може да @Autowire messageSource

Имам персонализиран клас изключения, който трябва да прочете някои съобщения за грешка от файлове със свойства. Но изглежда, че продължава да става нулев. Дори се опитах да добавя @Component, но все още не работи

@Component
public class FormValidationFailExceptionHolder {

    @Autowired
    private MessageSource messageSource;

    ...
    public void someMethod(){
        ....
        String message = messageSource.getMessage(errorid, msgargs, Locale.ENGLISH);
        ....
    }
}

Ето моята пролетна конфигурация

....
<context:component-scan base-package="simptex.my" />
....
 <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="useCodeAsDefaultMessage" value="false" />
    <property name="basenames">
        <list>
            <value>classpath:mgmtlabels</value>
            <value>classpath:error</value>
            <value>classpath:PWMResources</value>
        </list>
    </property>
    <property name="defaultEncoding" value="UTF-8" />
</bean>

Дори се опитах да декларирам bean изрично в xml конфигурацията на пролетта, но все още връщам нула

<bean id="formValidationFailException" class="simptex.my.core.exception.FormValidationFailException">
    <property name="messageSource" ref="messageSource" />
</bean>

Ето как извиквам FormValidationFailException

public class Foo{
    private HttpSession session;
    ....
    public void fooMethod()  {
        session.setAttribute(CommonSessionKeys.FORM_VALIDATION_EXECEPTION_HOLDER, new FormValidationFailExceptionHolder("roledd", "E0001"));
    }
}

@Controller
public class FooController  {
    @RequestMapping(value = "/xxxx")
    public void fooMethodxxx() {
        Foo foo = new Foo(session);
        foo.fooMethod();
    }
}

person vincent    schedule 29.09.2013    source източник


Отговори (1)


Доколкото разбирам, това, което наистина искате да постигнете, е персонализиран валидатор на формуляри.

@Component
public class CustomValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return clazz == FormBean.class;
    }

    @Override
    public void validate(Object target, Errors errors) {
        FormBean bean = (FormBean) target;

        if ( StringUtils.isEmpty( bean.getField() ) ) {
            errors.rejectValue("field", "field.empty");
        }

    }
}

"field.empty" е ключ във вашия файл със свойства.

field.empty=Field mustn't be empty

Сега във вашия контролер трябва да добавите:

@Autowired
private CustomValidator customValidator; 

@InitBinder
protected void initBinder(WebDataBinder binder) {
    if (binder.getTarget() instanceof FormBean) {
        binder.setValidator(customValidator);
    }
}

@RequestMapping(value = "/xxxx", method = RequestMethod.POST)
    public String fooMethodxxx(@ModelAttribute("bean") @Validated FormBean bean, BindingResult result) {
        if ( result.hasErrors() ) {
            prepareModel(model);
            return "form.view";
        }
        return "other.view"
    }

Когато публикувате формуляра, той ще бъде валидиран. За да покажете на потребителя съобщението за валидиране в jsp, трябва да добавите:

<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form"%>

<f:errors cssClass="error" path="field"></f:errors>
<f:input path="field" type="text"/>

Мисля, че това е правилният начин за работа с персонализиран валидатор.

person Łukasz Jarzyna    schedule 30.09.2013
comment
благодаря.. В крайна сметка използвах класическия начин за получаване на етикетите. имащ, който използва ResourceBundleMessageSource - person vincent; 03.10.2013
comment
vincent - Бихте ли споделили как решихте този проблем. Изобщо не мога да свържа автоматично MessageSource (ResourceBundleMessageSource) в персонализирана AuthenticationEntryPoint - person Shalin Ved; 13.01.2017