Проблема в том, что с MyTask в качестве EJB-компонента, реализующего Callable , вы удалили сам класс MyTask из «типа бина» этого бина Это означает, что он не может быть введен в «112» «клиента», согласно правилам в спецификации CDI 2.0 :
18.2.2. Типы компонентов сессионного компонента
Неограниченный набор типов компонентов для сессионного компонента содержит все локальные интерфейсы компонента и их суперинтерфейсы. Если сессионный компонент имеет представление без интерфейса, неограниченный набор типов компонентов содержит класс компонента и все суперклассы. Кроме того, java.lang.Object является типом компонента каждого сессионного компонента.
blockquote>Вот почему Weld не находит действительный bean-компонент MyTask , чтобы удовлетворить внедрение в ваш клиент TestBean .
Вы можете дать MyTask EJB представление без интерфейса, добавив аннотацию
@LocalBean
, например:@Stateless @LocalBean public class MyTask implements Callable
{ Или вы можете удалить
implements Callable
и рефакторинг например:public class MyTask { @Inject MyBean myBean; MyCallable callable = new MyCallable(); public Callable getCallable() { return callable; } private class MyCallable implements Callable
{ @Override public String call() throws Exception { System.out.println("MyTask called"); myBean.print(); return "Task called"; } } } public class TestBean { // ... MyTask task = myTaskInstance.get(); tasks.add(task.getCallable()) // ... } См. здесь для быстрого ознакомления с представлением без интерфейса, а также этот пост для дальнейшего обсуждения.
У меня есть ReSharper 4.1, и он действительно предлагает эту опцию (в любом направлении).
На самом деле, я рекомендовал бы бросить вызов стандарту... первый намного более читаем, чем последний (особенно, если Вы называете переменную pair
или что-то подобное). Я would't используют "var" для var i = 0
, но он идеально подходит для вышеупомянутого.
Для объемного изменения, перейдите в:
и работает...
Resharper делает это (только в версии 4 +, я уверен в нем), но я не знаю, необходимо ли его возможное для простого преобразования var в автоматический определенный тип - в конечном счете перейти к "var" и затем световые шоу, который дает Вам опцию указать тип явно
@Adam - Вы не можете объявить класс здесь, так как это не будет тем, что возвращается из IDictionary<,>.GetEnumerator()
- однако, можно исказить через using
:
using InnerPair = System.Collections.Generic.KeyValuePair<System.DateTime,
System.Collections.Generic.Dictionary<string, float>>;
Затем:
foreach(InnerPair pair in dict) {...}
Это - просто псевдоним типа, поэтому хорошо работает.
DevExpress поддерживает это с CodeRush и ими недавно запускающийся выдающий некоторые рефакторинги бесплатно. Рефакторинг Вас ищет, "Делают Явными"
http://devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/
Я утверждал бы, что, где у Вас есть сложные универсальные типы на Ваших объектах области, Вы должны определение типа их
class DomainValueCollection : KeyValue<DateTime, Dictionary<string, float>>{}
, где DomainValueCollection - что-то, что имеет смысл в Вашем доменном контексте
, код затем становится
var allItems = new DomainValueCollection();
, а не
var allItems = new KeyValue<DateTime, Dictionary<string, float>>();