2014-11-02 15 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中。

任何人都可以告訴我我在做什麼錯在這裏?什麼是正確的方式來創建這個類的新實例?

PS:行51中basicService被置於此方法內:

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

和構件dao定義是這樣的:

@Autowired 
protected Dao<E> dao; 
+0

那麼當這種方法調用list_values?誰實例化擁有DAO的bean是Spring的呢?你是否還實現/擴展了任何Spring bean生命週期接口/類? – SMA 2014-11-02 13:37:12

+0

@almasshaikh在方法'doStartTag(...)'方法中,在類的內部爲自定義標記Select調用此方法。 – 2014-11-02 14:13:53

回答

0

好的,我解決這個問題添加到我的項目名爲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); 
}