【问题标题】:cannot access to annotated spring service无法访问带注释的 spring 服务
【发布时间】:2009-10-08 22:29:12
【问题描述】:

我正在尝试访问@Service 定义的类

定义了接口,这里是一个实现

    @Service
    public class TypeServiceImpl implements TypeService {

        @Autowired
        TypeDAO dao;

        public List<DocType> findAll() {
    System.out.println("accessing findAll"); //have no appearence
    return dao.findAll();
}

公共类型DAOImpl() { System.out.println("构造类型DAOImpl"); }

...

}

DAO 代码:

@Repository
public class TypeDAOImpl extends BaseDAO<Type, Long> implements TypeDAO{

}

BaseDAO:

public class BaseDAO<T, ID extends Serializable> extends GenericDAOImpl<T, ID> {

    @Autowired
    @Override
    public void setSessionFactory(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }
}

使用generic dao 应用程序的配置加载正常(没有警告或错误),但是当我尝试使用服务时:

@Autowired
private TypeService TypeService;
public void init() {

        try {
            for (Type d : TypeService.findAll()) {
                System.out.println(d.getType());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
}

在应用程序上下文中:

<!-- Use annotations (@Autowired) for property injection -->
    <context:annotation-config />

在日志中: 信息:在 org.springframework.beans.factory.support.DefaultListableBeanFactory@14db0e3 中预实例化单例: ... typeDAOImpl,appMain, typeServiceImpl

我的 web.xml

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/config/application-context.xml,classpath:/config/datasource-context.xml</param-value>
    </context-param>
    <context-param>
        <description>
    Vaadin production mode</description>
        <param-name>productionMode</param-name>
        <param-value>false</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
     <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener> 
     <servlet>
        <servlet-name>My Application</servlet-name>
        <servlet-class>com.vaadin.terminal.gwt.server.ApplicationServlet</servlet-class>
        <init-param>
            <description>
        Vaadin application class to start</description>
            <param-name>application</param-name>
            <param-value>myapp.main.MainApp</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>My Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
...

堆栈跟踪“非常有用”(我使用 vaadin 作为 Web 框架)

java.lang.NullPointerException 在 main.AppMain.init(AppMain.java:26) 在 com.vaadin.Application.start(Application.java:497) 在 com.vaadin.terminal.gwt.server.AbstractApplicationServlet.startApplication(AbstractApplicationServlet.java:1001) 在 com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:411) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) 在 java.lang.Thread.run(Unknown Source)

有什么建议吗?

我为 GenericDAOHibernate 和 TypeDAOImpl 添加了构造函数,所以据我了解,这些 bean 已初始化 ... 12.10.2009 12:57:48 org.hibernate.impl.SessionFactoryImpl 信息:构建会话工厂 12.10.2009 12:57:48 org.hibernate.impl.SessionFactoryObjectFactory addInstance 信息:未将工厂绑定到 JNDI,未配置 JNDI 名称 构建通用 DAO 构造 TypeDAOImpl 12.10.2009 12:57:48 org.springframework.web.context.ContextLoader initWebApplicationContext ...

我不明白,因为这个配置适用于 ZK..

【问题讨论】:

  • 只是猜测,但您是否已将适当的命名空间添加到您的 Spring 应用程序上下文中?
  • 可以添加stackstrace吗?
  • 我在下面的评论中问过这个问题,根据上面的堆栈跟踪,我会再问一次 - 是 AppMain (大概来自上面最后一个代码示例 - 带有 @987654329 的那个@method 是)在您的上下文中定义为 bean?因为如果不是,您希望自动布线如何工作?
  • 我尝试使用以下注释定义 AppMain:@Configurable(preConstruction = true) @Service 和 @Component
  • 如何将 spring 上下文加载为 servlet 过滤器或 Web 应用程序侦听器? AppMain是spring发起的还是vaadin发起的?

标签: java spring annotations


【解决方案1】:

您发布的代码相当不一致。

findAll() 方法没有在任何地方声明;加上服务实现实现了Service,但你试图将它自动连接到TypeService,这是行不通的。

如果第一个代码片段改为:

@Service
public class TypeServiceImpl implements TypeService {

它是您的应用程序上下文中唯一的 TypeService 实现,自动连接会起作用。

【讨论】:

  • findAll() 在 TypeServiceImpl 中声明: public List findAll() { System.out.println("accessing findAll"); //不出现!!返回 dao.findAll(); } dao 基于 GenericDAOImpl
  • 您尝试使用该服务的代码(您的最后一个代码 sn-p) - 它来自哪里?它也是在 same 上下文中声明的 bean 的一部分吗?
猜你喜欢
  • 2011-05-16
  • 1970-01-01
  • 2012-07-27
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多