Reflection & Spring
От: Аноним  
Дата: 13.06.11 09:49
Оценка:
Подскажите как сделать, чтобы зарабобтало..

Вообщем есть контроллер в него приходят два параметра, один отвечает за то какую стратегию подгрузить. Через рефлешн подгружаю нужную стратегию, но CustomerDao остаеться не проинициализированным и как следствие NPE.

Мне необходим доступ к базе в каждой реализации стратегии, наборы данных будут различны, посему доступ к базе хочеться вынести в стратегию.

///////////////////////////////////////////////////////////////////////////
@Controller
@RequestMapping("/json/{customerId}")
public class TestJsonController {

    @Autowired
    private ReportService reportService;

    @RequestMapping(method = RequestMethod.GET)
    public @ResponseBody
    Map<String, String> view(@PathVariable Integer customerId, @RequestParam("reportId") Integer reportId)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException {

        Report report = reportService.getReference(reportId);

        Class clazz = Thread.currentThread().getContextClassLoader().loadClass(report.getKlass());
        IStrategy strategy = (IStrategy)clazz.newInstance();

        return strategy.execute(customerId);
    }

}

///////////////////////////////////////////////////////////////////////////

@Service
public class IncomeStrategy implements IStrategy {
    
    @Autowired
    CustomerDao customerDao;

    @Transactional
    public Map<String, String> execute(Integer customerId) {
        Customer customer = customerDao.getReference(customerId);
        
        List<TurnoverSheet> turnoverSheets = customer.getTurnoverSheets();

        ...        
        //fill map

        ...
        return map;
    }
}



Спасибо.
Re: Reflection & Spring
От: Blazkowicz Россия  
Дата: 13.06.11 09:57
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Мне необходим доступ к базе в каждой реализации стратегии, наборы данных будут различны, посему доступ к базе хочеться вынести в стратегию.

После того как создали экземпляр, нужно вызвать с ним какой-то метод отсюда.
http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/factory/config/AutowireCapableBeanFactory.html
Re[2]: Reflection & Spring
От: Аноним  
Дата: 13.06.11 10:56
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

Спасибо, помогло!
Re: Reflection & Spring
От: Аноним  
Дата: 13.06.11 10:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите как сделать, чтобы зарабобтало..


А>Вообщем есть контроллер в него приходят два параметра, один отвечает за то какую стратегию подгрузить. Через рефлешн подгружаю нужную стратегию, но CustomerDao остаеться не проинициализированным и как следствие NPE.


А зачем вам рефлексия и пр.?
Не проще ли брать сразу готовый бин из контекста по его имени? ну или по имени класса, если вам так проще. Он уже готовый будет, не нужно никаких плясок.
Re[2]: Reflection & Spring
От: Blazkowicz Россия  
Дата: 13.06.11 11:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не проще ли брать сразу готовый бин из контекста по его имени? ну или по имени класса, если вам так проще. Он уже готовый будет, не нужно никаких плясок.

Возможно сделано по аналогии с JasperReports. Т.е. класс изначально является частью отчета и поместить его в контекст никак не выходит. Но я соглашусь с вопросом. Если можно сделать иначе, то нужно сделаьт иначе.
Re[2]: Reflection & Spring
От: koptenkov  
Дата: 13.06.11 12:16
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>А зачем вам рефлексия и пр.?

А>Не проще ли брать сразу готовый бин из контекста по его имени? ну или по имени класса, если вам так проще. Он уже готовый будет, не нужно никаких плясок.

Спасибо за совет, да так даже будет проще. Еще не настолько хорошо спринг знаю


@RequestMapping(method = RequestMethod.GET)
    public @ResponseBody
    Map<String, String> view(@PathVariable Integer customerId, @RequestParam("reportId") Integer reportId) {

        Report report = reportService.getReference(reportId);

        IStrategy strategy = (IStrategy)ApplicationContextProvider.getApplicationContext().getBean(report.getType());

        return strategy.execute(customerId);
    }
Re[3]: Reflection & Spring
От: . Великобритания  
Дата: 13.06.11 19:29
Оценка:
Здравствуйте, koptenkov, Вы писали:

k> IStrategy strategy = (IStrategy)ApplicationContextProvider.

Типа того, но по-моему более кошерный способ это использовать ApplicationContextAware интерфейс.
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.