Spring 4 - Autowire 通用

标签 spring spring-mvc generics groovy

我创建了一个通用接口(interface) CRUDService 来生成多个实体服务类,它们都实现了相同的 CRUD 方法。

interface CRUDService<T> {

public abstract T saveEntity(T entity)

public abstract T getEntity(T entity)

public abstract long getCount()
}

然后我从我的实体 Hypervisor 实现了一个服务类 HypervisorService,它实现了我的 CRUDService
@Service
class HypervisorService implements CRUDService<Hypervisor> {

@Autowired
private HypervisorRepository hypervisorRepository

@Override
@Transactional
public Hypervisor saveEntity(Hypervisor entity) {
    return hypervisorRepository.saveAndFlush(entity)
}

@Override
public Hypervisor getEntity(Hypervisor entity) {
    return hypervisorRepository.findOne(entity.getId())
}

@Override
public long getCount() {
    return hypervisorRepository.count()
}
}

但是当我尝试自动连接它时
@Autowired
private CRUDService<Hypervisor> hypervisorService

我得到一个“java.lang.ClassCastException:com.sun.proxy.$Proxy68 不能转换为 net.ifis.ites.hermes.services.HypervisorService”异常。

我不明白为什么 Spring 说它有一个 classcastexception 但是当我将我的服务代码更改为
@Service
class HypervisorService<Hypervisor> implements CRUDService<Hypervisor> {
...
}

我的代码有效,我可以使用我的通用接口(interface),但我认为这不是使用它的好习惯。

堆栈跟踪 :
java.lang.ClassCastException: com.sun.proxy.$Proxy68 cannot be cast to net.ifis.ites.hermes.services.HypervisorService
at net.ifis.ites.hermes.services.HypervisorService$saveEntity.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:122)
at net.ifis.ites.hermes.ui.MyVaadinUI.init(MyVaadinUI.groovy:38)
at com.vaadin.ui.UI.doInit(UI.java:646)
at net.ifis.ites.hermes.ui.MyVaadinUI.doInit(MyVaadinUI.groovy)
at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:214)
at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:350)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:466)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:358)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:128)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:146)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

在我的 VaadinUI 中,我只自动连接我的服务类并生成一个管理程序,并尝试将其保存到我的数据库中,并将所有管理程序的当前数据库计数可视化为一个标签。
@Component
@SpringUI
class MyVaadinUI extends UI {

@Autowired
private CRUDService<Hypervisor> hypervisorService

@Override
protected void init(VaadinRequest vaadinRequest) {

    VerticalLayout layout = new VerticalLayout()

    Hypervisor hypervisor = hypervisorService.saveEntity(new Hypervisor("KVM"))

    layout.addComponent(new Label("Hypervisors : " + hypervisorService.getCount()))

    setContent(layout)
}

}

我现在将尝试在我的应用程序中使用 CGLIB。

最佳答案

我在我的配置中使用
@EnableAspectJAutoProxy(proxyTargetClass=true)现在我的代码适用于

class HypervisorService implements CRUDService<Hypervisor> {
...
}

关于Spring 4 - Autowire 通用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31010409/

相关文章:

c# - 泛型的问题

java - 使用 DI 的类只能通过 DI 创建吗?

java - 启动过滤器 springSecurityFilterChain java.lang.NoClassDefFoundError 异常

java - Java中如何实现对象代理或类代理?

css - 无法让外部 css 在动态 web 元素 spring 中工作

java - Spring Web MVC Tiles 继承自相同的定义

java - 如何配置Spring/Spring Boot访问首页?

java - 将 BaseClass 实例插入 List<?扩展基类> (Java)

java - Hibernate 自引用父子

ios - 检查一个数组是否包含 Swift 中另一个数组的所有元素