我尝试在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并创建一个新的处理程序,则调用特定的服务。
由于