Почему значение введенного бина равно нулю

У меня есть пользовательский тег. Когда я внедряю ресурс весеннего сообщения и хочу получить доступ к файлу свойств, внедренный компонент всегда имеет значение null. Что я делаю неправильно,

 @Component
public class GridColumnsCutomTagHander extends TagSupport {

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Inject
private MessageSource messageSource;

private String propertyFileName;

/**
 * @return the propertyFileName
 */
public String getPropertyFileName() {
    return this.propertyFileName;
}

/**
 * @param propertyFileName
 *            the propertyFileName to set
 */
public void setPropertyFileName(String propertyFileName) {
    this.propertyFileName = propertyFileName;
}

@Override
public int doStartTag() throws JspException {

    try {
        JspWriter out = pageContext.getOut();
        String gridColumnValues = messageSource.getMessage(propertyFileName,
                null, EWMSUser.getCurrentLanguageLocale());
        out.println(gridColumnValues );
    } catch (IOException e) {
        e.printStackTrace();
    }

    return (SKIP_BODY);
}

Пожалуйста, помогите мне выяснить, где проблема

1 ответ

Исходя из моего опыта, MessageSource может быть успешно внедрен, если текущий класс имеет среду servletContext. Так что вам нужно внедрить его в свой слой контроллеров и затем передать его в качестве параметра конструкции в текущий класс тегов.

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

  • Код для класса GridColumnsCutomTagHander
public class GridColumnsCutomTagHander extends TagSupport {


private static final long serialVersionUID = 1L;


private MessageSource messageSource;

public GridColumnsCutomTagHander(){
}

public GridColumnsCutomTagHander(MessageSource messageSource){
   this.messageSource=messageSource;
}

private String propertyFileName;

/**
 * @return the propertyFileName
 */
public String getPropertyFileName() {
    return this.propertyFileName;
}

/**
 * @param propertyFileName
 *            the propertyFileName to set
 */
public void setPropertyFileName(String propertyFileName) {
    this.propertyFileName = propertyFileName;
}

@Override
public int doStartTag() throws JspException {

    try {
        JspWriter out = pageContext.getOut();
        String gridColumnValues = messageSource.getMessage(propertyFileName,
                null, EWMSUser.getCurrentLanguageLocale());
        out.println(gridColumnValues );
    } catch (IOException e) {
        e.printStackTrace();
    }

    return (SKIP_BODY);
}
  • Используйте его в своем классе слоя контроллера:
@Controller   
public TestController{

 @Inject
 private MessageSource messageSource;

@RequestMapping("test")
 public void test(){
   new GridColumnsCutomTagHander(messageSource);//now the messageSource is not null
 }
}
Другие вопросы по тегам