Как сообщить Spring, что свойство Bean должно быть заполнено? - PullRequest
2 голосов
/ 16 апреля 2011

Допустим, у меня есть такой класс Java:

public class PersonGrabber {
  private PersonDAO dao;

  public void setDao(PersonDao dao) {
    this.dao = dao;
  }
  public PersonDAO getDao() {
    return this.dao;
  }
  //...
}

И у меня есть соответствующий Spring Bean, как это:

<bean id="personGrabber" class="com.stackoverflow.example.PersonGrabber">
  <property name="dao"><null/></property>
</bean>

Теперь это плохо, потому что мне действительно нужно, чтобы свойство dao было установлено на что-то в этом бине, прежде чем оно станет полезным. Тем не менее, я не хочу ждать до времени выполнения, чтобы ждать, пока он выдаст NullPointerException. Можно ли сказать Spring, что свойство bean MUST должно быть заполнено, прежде чем его можно будет использовать? В идеале, я хотел бы, чтобы он потерпел крах при инициализации, чтобы мне не пришлось ждать, пока это выяснит.

Я надеялся на что-то вроде аннотации в духе:

public class PersonGrabber {
  @SpringRequired
  private PersonDAO dao;
  //...
}

Есть какая-нибудь помощь от некоторых ветеранов Весны?

Ответы [ 4 ]

5 голосов
/ 16 апреля 2011

Для класса, который у вас есть, где вам всегда нужно, чтобы другое свойство было установлено в ненулевое значение, самый простой способ применить это как двойную вещь.Используйте аннотацию @Required на установщике, чтобы сообщить Spring, что метод всегда должен вызываться, и проверку внутри установщика, чтобы увидеть, имеет ли инъекция реальный экземпляр (т. Е. Не ноль).

@Required
public void setDao(PersonDao dao) {
    if (dao == null)
        throw new IllegalArgumentException("property 'dao' is null");
    this.dao = dao;
}

Последняя небольшая часть - вам нужно убедиться, что обработка аннотаций включена в ваших файлах конфигурации Spring:

<context:annotation-config/>

Имейте в виду, у вас есть хороший шансуже получил это.

3 голосов
/ 16 апреля 2011

Нужная аннотация: @ Обязательно

Вы также можете использовать атрибут init-method в вашем компоненте, чтобы указать на метод, который вызываетсяпосле того, как все свойства заполнены.Это позволит вам выполнить проверку после установки.

2 голосов
/ 16 апреля 2011

Еще один способ сделать это - объявить класс бина как реализующий InitializingBean и реализовать метод afterPropertiesSet, чтобы проверить, что для свойства установлено допустимое значение.

0 голосов
/ 16 апреля 2011

Как насчет использования проверки JSR 303 с пружиной.? У вас были какие-то проблемы с этим .?

Ссылка здесь , на случай, если вы этого раньше не видели.

...