2014-11-02 1 views
1

В моем текущем проекте, когда этот метод называется:InvocationTargetException пытаюсь сделать новый экземпляр службы класса

public Collection<? extends Object> list_values() throws Exception { 
    String nome = classe().getSimpleName(); 
    String nome_service = nome+"Service"; 
    String local_service = "com.spring.model."+nome; 
    Class<?> clazz = Class.forName(local_service.toLowerCase()+"."+nome_service); 
    Object serv = clazz.newInstance(); 
    Collection<? extends Object> list = (Collection<? extends Object>) serv.getClass().getMethod("lista").invoke(serv); 
    return list; 
} 

приложение вызывает InvocationTargetException вызванного этой ошибкой:

Caused by: java.lang.NullPointerException 
    at com.spring.config.generic.service.basicService.lista(basicService.java:51) 

где basicService является суперкласс для класса, хранящегося в переменной clazz.

Любой может сказать мне, что я делаю неправильно здесь? Какой правильный способ создать новый экземпляр этого класса?

пс .: линия 51 в basicService помещается внутри этого метода:

@Transactional 
public List<?> lista() { 
    return dao.findAll(); 
} 

и член dao определяется следующим образом:

@Autowired 
protected Dao<E> dao; 
+0

Хорошо, когда это метод list_values ​​называется? И кто олицетворяет боб, который держит DAO, это весной? Кроме того, вы реализовали/расширили интерфейс/класс жизненного цикла Spring bean? – SMA

+0

@almasshaikh Этот метод вызывается внутри класса для пользовательского тега. Выберите в методе 'doStartTag (...)'. –

ответ

0

Ok, я решить эту проблему, добавив к моему проект класса ApplicationContextHolder, с этим кодом:

@Component 
public class ApplicationContextHolder implements ApplicationContextAware { 

    private static ApplicationContext context; 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     context = applicationContext; 
    } 

    public static ApplicationContext getContext() { 
     return context; 
    } 

} 

окончательный код для функции list_values(...) таков:

public List<?> list_values() throws Exception { 
    String nome = classe().getSimpleName(); 
    Class<?> clazz = Class.forName("com.spring.model."+nome.toLowerCase()+"."+nome+"Service"); 
    Object object = clazz.newInstance(); 
    ApplicationContextHolder.getContext().getAutowireCapableBeanFactory().autowireBean(object); 
    return (List<?>) object.getClass().getMethod("lista").invoke(object); 
}