2017-08-01 53 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" />