2017-08-01 49 views
0

我實現JSF +春集成的Web應用程序,我有幾個服務類象下面這樣:如何獲取並設置Spring的Autowired對象?

@Service 
@Transactional 
public class AccountService 
{ 
    @Autowired 
    private AccountRepository accountRepository; 

    public AccountRepository getRepository() 
    {     
     return accountRepository; 
    } 

    public Account insertOrUpdate(Account entity) 
    { 
     return accountRepository.save(entity); 
    } 

    public Account findOne(Account entiti) 
    { 
     return accountRepository.findOne(entiti.getId()); 
    } 
    //some other methods 
} 

我想實現一個基類,它包含了類似下面的所有服務類常用的方法:

@Service 
@Transactional 
public class BaseService 
{ 
    JpaRepository repository; 

    public void setRepository(JpaRepository repository) 
    { 
     this.repository = repository; 
    } 

    public BaseEntity insertOrUpdate(BaseEntity entity) 
    { 
     return (BaseEntity) repository.save(entity); 
    } 

    public BaseEntity findOne(BaseEntity entity) 
    { 
     return (BaseEntity) repository.findOne(entity.getId()); 
    } 
} 

但這裏的問題是如何動態地自動裝配倉庫動態?我試圖從下面的子類設置存儲庫,但不起作用。當我在超類中使用repository對象時,將導致NullPointerException。有關如何實現這一目標的任何建議?

@Service 
@Transactional 
public class AccountService extends BaseService 
{ 
    @Autowired 
    private AccountRepository accountRepository; 

    public AccountService() 
    { 
     super.setRepository(accountRepository); 
    } 
} 

回答

0

這個問題可以通過下面創建一個通用的基本服務類來解決:
BaseService.java,你的服務方法的接口。

public interface BaseService<T extends BaseEntity, ID extends Serializable, R extends JpaRepository> 
{ 
    public T insertOrUpdate(T entity); 

    public Iterable<T> insertOrUpdate(Iterable<T> entities); 

    public T findOne(ID id); 

    public List<T> findAll(); 

    //......... 
} 

BaseServiceImpl,它實現了BaseService接口

@Transactional 
public abstract class BaseServiceImpl<T extends BaseEntity, ID extends Serializable, R extends JpaRepository<T, ID>> implements BaseService<T, ID, R> 
{ 
    protected R repository; 

    protected BaseServiceImpl(R repository) 
    { 
     this.repository = repository; 
    } 

    @Override 
    public T insertOrUpdate(T entity) 
    { 
     return repository.save(entity); 
    } 

    @Override 
    public Iterable<T> insertOrUpdate(Iterable<T> entities) 
    { 
     return repository.save(entities); 
    } 
    //......... 
} 

AccountService.java一類,最後,你的服務類擴展了BaseServiceImpl

@Service 
@Transactional 
public class AccountService extends BaseServiceImpl<Account, Integer, AccountRepository> //implements BaseService<Account, Integer, AccountRepository> 
{ 
    @Autowired 
    public AccountService(AccountRepository repository) { 
     super(repository); 
    } 

    public AccountRepository getRepository() 
    { 
     return super.repository; 
    } 

    //create your own service method here 
} 

最後,對不起因爲我的英語不好。

0
如果你想 get and set autowired object和使用 @Autowired註解,那麼你需要在類的鏈接 @Service@RestController和使用代碼 <context:component-scan annotation-config="true" base-package="com.demo.test"/><context:annotation-config />使用標註爲 ApplicationContaxt.xml文件掃描基礎包

,這個低音包掃描使用掃描註釋。您還可以使用其他方式來創建使用java類配置的bean並創建自動裝配對象。在java配置類中,您需要使用@Configuration註釋。你可以找到下面的示例代碼配置,其中我對modelMapper班組長

@Configuration 
public class ModelMapperConfig { 

@Bean(name = "modelMapper") 
public ModelMapper getModelMapper() { 
    ModelMapper modelMapper = new ModelMapper(); 
    return modelMapper; 
} 

@Bean(name = "modelMapperWithConverter") 
public ModelMapper getModelMapperWithConverter() { 
    ModelMapper modelMapper = new ModelMapper(); 
    return modelMapper; 
} 

你也可以從XML創建CLAS bean創建bean時,你需要創建豆成ApplicationContacxt.xml。你可以找到下面的示例代碼:

<bean id = "advertisementRepo" class = "com.amstech.mayal.demo.test.AdvertisementRepo" /> 
相關問題