2015-10-09 6 views
0

У меня есть контроллеры Spring, которые используют инъекцию конструктора для удовлетворения зависимостей уровня сервиса. Работает хорошо. Теперь в организации есть какой-то старый код, который дважды проверяет правильность зависимостей. Я считаю это анти-шаблоном, так как это код, связанный с проблемой сквозной резки, о которой не должен беспокоиться инжектируемый клиент.Повторная проверка введенных полей весной

Если зависимость не может быть решена, то контейнер IoC (весна) поднимет соответствующую ошибку (UnSatisfiedLink или что-то еще), клиент, использующий эту службу, должен быть агностик относительно того, как или если эти зависимости были правильно введены. что все зависимости инициализированы и готовы к работе. В этом суть использования IoC в первую очередь.

Например, я вижу это:

public MyController(MyService myService) { 
    this.myService = myService; 
    } 

, а затем:

@PostConstruct 
public void afterPropertiesSet() throws Exception { 
if(myService == null) { // unecessary in my opinion 
    throw new IllegalArgumentException("MyService is not set!"); 
} 
} 

Этих типов «двойных проверки» является ненужным и привести к перекрестному режущим относятся кода беспорядок, мнение?

+0

_ «мнения?» _ Это не вопрос мнения, а факт, который вы можете легко доказать или опровергнуть (мнения, основанные на вопросах не имеют места на SO, в любом случае) – kryger

ответ

-1

я не считал бы чек, как этот

if(myService == null) { 
//throw nice readable error 
} 

беспорядком, который я хотел бы удалить как часть обзора кода. Проблема, которую я больше увижу, это часть «throws Exception», которую вы должны представить сейчас как часть этого метода. Поэтому каждый метод, вызывающий этот метод, теперь должен реализовать реализацию try/catch или re-throw.

Я бы рекомендовал исключение, которое наследуется от RunTimeException.

Причина этого в том, что это исключение, которое представляет собой серьезную ошибку конфигурации или настройки. Вы не ожидаете, что это произойдет как часть любой регулярной функциональности. Поэтому я бы не подумал, что какой-либо другой метод должен быть «проинформирован» и имеет специальный блок try/catch, чтобы вести себя по-другому. Приложение должно в основном сбой с Исключением. Прямо сейчас. На глобальном уровне обслуживания могут быть некоторые обработчики catch, которые захватывают эти исключения, а затем, например, транзакции отката, переводят Exception в SoapError и так далее. Но, как правило, я бы не стал рассматривать какое-либо дополнительное значение в метании и явном исключении, которое требует теперь других методов вызова для реализации специального блока catch.

+0

Спасибо за комментарий :) Причина, по которой я думал проверки в afterPropertiesSet являются необходимыми из-за следующего: a) PostConstruct никогда не будет достигнут, поскольку создание экземпляра завершится неудачно, когда AutoWiring завершится с ошибкой. По умолчанию при аутсорсинге поиск невозможен. Spring будет выбрасываться и UnsatisfiedDependencyException. B) Нулевые аргументы, переданные конструктору, не имеют варианта использования в приложении, поскольку он подбирается через проверку компонентов, а не вручную. – funnyman7878

+0

Возможно, вы правы, но могут быть случаи где кто-то перезаписывает обработчиков и так далее. Как правило, вы правы. Но если это код другого человека, я бы не стал обвинять его в этом, потому что это не обязательно неправильно. Я бы просто удостоверился, что эта проверка не бросает исключения, что у нас нет конкретных функций/требований. –

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