使用泛型参数的Spring autowire麻烦

时间:2015-01-30 23:15:47

标签: spring generics autowired

我尝试在autowire中使用泛型参数,但它不起作用。我的目标是使用Spring 4.1.3和Hibernate

创建一个通用的JSON控制器

我有一个通用的抽象类,我用它来通过模型objec(和我的DAO一样)创建服务作为泛型参数。

我的AbstractService的代码

public interface IGenericService<T extends Serializable> extends IOperations <T>{}

public interface IOperations<T extends Serializable> {
    T findOne(final long id);
    List<T> findAll();
    void create(final T entity);
    T update(final T entity);
    void delete(final T entity);
    void deleteById(final long entityId);
    List<T> findByField(String field, String value);
    T save(final T entity);
}

//MyAbstractService (generic service)                        
public abstract class AbstractService<T extends Serializable> implements
        IGenericService<T> {

    public static final Logger logger = LoggerFactory
            .getLogger(AbstractService.class);

    public AbstractService(){}

   ...
    @Override
    @Transactional
    public T update( T entity) {

        logger.debug("public T update( T entity)");
        return getDao().update(entity);
    }
...
}

现在我用这个抽象服务

创建一个SecuredUserService
@Transactional
@Component //(value = "userService")
@Qualifier("userService")
public class UserService extends AbstractService<SecuredUser> implements
        IUserService {
 // I override the method upate of the abstract service
@Override
@Transactional
public SecuredUser update(SecuredUser user){
... // password encoding for example
}
}
public interface IUserService extends IGenericService<SecuredUser> {
     T findOne(final long id);
    ...
    }

在我的JUnit测试中,我使用以下代码进行了自动装配:

@Autowire
IGenericService<SecuredUser> userGenericService;

或者

@Autowire
IUserService userService;

此时一切正常,我使用的是userService的overrided方法,而不是abstractService的方法。我通过了我的Junit测试。我创建了一个包。

现在我想制作通用的spring mvc控制器来处理常见的Json请求GET / PUT / DELETE / POST:

//通用控制器

public abstract class GenericSecuredController  <MODEL     extends Serializable> extends CommonSecuredController {

    /**
     * spring generic service retrieve by MODEL class type
     */
    @Autowired
    private IGenericService <MODEL> genericService;
    /**
     * Spring generic URI retrieve by MODEL class type
     */
    @Autowired
    private IGenericURI<MODEL> genericURI ;
...
}

//以通用方式管理URI的接口

public interface IGenericURI<MODEL extends Serializable> {

    // root for the controller
    public static String CONTROLLER_MAPPING="" ;
    // path to the file system
    public static String PATH_MAPPING = "";
    // key to retrieve data in path
    public static  String PATH="{id}";
    // Json REST SERVICE MappedUri
    public static  String JSON_DUMMY = "/dummy";
    public static  String JSON_GET = "/" + PATH;
    public static  String JSON_GET_ALL = "";
    public static  String JSON_CREATE = "";
    public static  String JSON_DELETE = "/" + PATH;
    public static  String JSON_UPDATE = "/" + PATH;

    public static String HTML_VIEW = "/{view}.view.html";
    public String getControllerMapping() ;
    public String getPathMapping() ;

}

// SecuredUser模型对象的特定URI

@Component
public  class SecuredUserURI implements Serializable, IGenericURI<SecuredUser> {
    public static final String CONTROLLER_MAPPING = "/user";
    public static final String PATH_MAPPING = "user";

    public String getControllerMapping() {
        return CONTROLLER_MAPPING;
    }

    public String getPathMapping() {
        return PATH_MAPPING;
    }
}                      

现在我可以像这样为SecuredUser创建一个特定的控制器:

public class UserController extends GenericSecuredController<SecuredUser> {
    /**
     * creator to set Class type for the GenericSecuredController<MODEL>
     */
    public UserController() {
        super(SecuredUser.class);
    }
 }

此时出现问题。

的自动装配
IGenericURI<MODEL> 

工作正常,但用

自动装配
IGenericService <MODEL> genericService; 

不使用userService的覆盖特定方法,但使用具有常见行为的抽象方法!!!

所以我的问题是:  是否可以使用通用参数自动装配bean,就像在我的示例中一样。  对于Spring自动装配可能有很多级别。

其他信息: 作为解决方法,我尝试将userService作为控制器的参数传递但是,相同的行为:通用服务使用抽象方法。

更新:如果我在UserController中自动装配IGenericService genericService并创建一个新的处理程序,则调用特定的服务。

由于

0 个答案:

没有答案