`

WebService对象调用spring注解无法操作DAO的问题

 
阅读更多

      在项目开发中,使用sap服务器进行系统开发。由于编写的是webservice,所以启动的时候要加载spring的类,而sap服务器在这时候就会出现无法获得spring工厂中的类,万分头疼。
      解决方案就是最上方的webservice不要去依赖注入spring的类,而是要在方法中取获取该spring工厂中的类。
      问题又出现了,spring工厂提供的类不能去new,只能通过其他途径去获取了。
      有人说:好,写一个工厂类BeanFactory,内部使用ClassPathXmlApplicationContext类加载spring的配置文件,从而获得需要的类。
      可是项目是web项目,如果再使用这样的加载机制就会出现spring工厂不单一的情况,获得的类也可能不是单一的。所以我们要从web方面处理。

 首先,如果你是这样直接使用的话,对象是空的,如下图,moneyuserDAO是无法直接使用的,即使spring已经对其进行加载,但是在webservice中是不能直接使用的,但是spring加载的访问数据库持久层的DAO对象等会存储在WebApplicationContext中,那么我有了以下的方式

     

解决方案:

 

      一、编写ServicesSingleton,代码如下:

package com.common.bssp.home.servlet;
import org.springframework.web.context.WebApplicationContext;
public class ServicesSingleton {	
	private WebApplicationContext servletContext;
	private volatile static ServicesSingleton singleton;

	  public WebApplicationContext getServletContext() {
	    return servletContext;
	  }

	  public void setServletContext(WebApplicationContext servletContext) {
	    this.servletContext = servletContext;
	  }

	  private ServicesSingleton() {
	  }

	  public static ServicesSingleton getInstance() {
	    if (singleton == null) {
	      synchronized (ServicesSingleton.class) {
	        if (singleton == null) {
	          singleton = new ServicesSingleton();
	        }
	      }
	    }
	    return singleton;
	  }
	  
	  public Object getDAO(Class<?> classNameOfDAO) {
	    String implName = classNameOfDAO.getSimpleName();
	    String firstChar = implName.substring(0, 1);
//	    implName = firstChar.toLowerCase() + implName.substring(1) + "Impl";
	    implName = implName.substring(1) + "Impl";
	    return singleton.getServletContext().getBeansOfType(classNameOfDAO).get(implName);
	 
	  }
	  
}

 然后编写初始化InitServlet,代码如下:

 

package com.common.bssp.home.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class InitServlet extends HttpServlet {
	private static final long serialVersionUID = -3962535683227715257L;
	  @Override
	  public void init() throws ServletException {
		  
		System.out.println("=============================init InitServlet  ====================");  
	    WebApplicationContext ctx = WebApplicationContextUtils
	    		.getRequiredWebApplicationContext(getServletContext());
	    ServicesSingleton.getInstance().setServletContext(ctx);
	  }
	
	public InitServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); 
		
	}

	

	
	

	
		  
}

    上面的代码就是将spring工厂存放在ServicesSingleton的变量中。

    最后编写web.xml把InitServlet添加进去,需要load-on-startup值为1代码如下:

 

<servlet>
     <servlet-name>InitServlet</servlet-name>
     <servlet-class>com.common.bssp.home.servlet.InitServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

 

    需要在XML中显式声明bean,ssoDao不能用注解

 

 <bean id="ssoDao" class="com.common.bssp.home.dao.impl.SsoDaoImpl">	 
	 </bean>

 CXF配置:

 

<jaxws:endpoint address="/SsoService"
		implementorClass="com.common.bssp.home.webservice.impl.SSOServiceImpl" />

 

使用示例:

 

private ISsoDao ssoDao ;
	
	
	public String acceptPublicKey(@WebParam(name="key")String key)
	{
		ServicesSingleton single = ServicesSingleton.getInstance();		
		ssoDao = (SsoDaoImpl)single.getServletContext().getBean("ssoDao");
		
		if(key!=null && key.length()>0)
		{			
			//保存到数据库
			PublicKey publicKey = new PublicKey();
			publicKey.setPublicKey(newKey);
			publicKey.setGenericDate(new Date());
			this.ssoDao.save(publicKey);

 

   启动Tomcat则自动发布webservice。测试代码:

 

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.common.bssp.home.webservice.SSOService;

public class Client {
	
//	private final static String ADDRESS = "http://localhost:8080/BSSP/services/SSOService";  
	private final static String ADDRESS = "http://localhost:8080/BSSP/services/SsoService";
    
	   public static void main(String args[]) {  
	      JaxWsProxyFactoryBean jwpFactory = new JaxWsProxyFactoryBean();  
	      jwpFactory.setAddress(ADDRESS);  
	      jwpFactory.setServiceClass(SSOService.class);  
	      SSOService hw = (SSOService)jwpFactory.create();  
	      String response = hw.acceptPublicKey("key124");  
	      System.out.println(response);  
	   }  

	   
}

 

分享到:
评论

相关推荐

    用XFire开发WebService+Spring注解

    【标题】"用XFire开发WebService+Spring注解"涉及的主要知识点是利用XFire框架创建Web服务,并结合Spring框架的注解进行服务的管理和集成。XFire是一个强大的Java Web Service实现,它允许开发者轻松地创建和消费...

    webservice,通过spring mybiatis 访问数据库mysql

    在本项目中,Spring被用来管理服务端的bean,包括数据访问对象(DAO)和业务逻辑层(Service)。它还提供了一个方便的环境来配置和创建WebService服务。 2. **MyBatis**: MyBatis是一个轻量级的持久层框架,它...

    WebService CXF Spring Hibernate

    6. **创建DAO层**:定义数据访问对象(DAO),使用Spring的`HibernateTemplate`或`JdbcTemplate`进行数据操作。 7. **实现业务逻辑**:在Service层,利用DAO实现业务逻辑,同时可以通过Spring的`@Transactional`注解...

    spring使用注解暴露remoting服务

    在Spring框架中,注解是实现服务暴露和远程调用(Remoting)的重要方式,它极大地简化了配置,提高了代码的可读性和可维护性。本文将深入探讨如何使用注解来实现Spring中的Remoting服务。 首先,让我们理解什么是...

    webservice提供数据访问spring+hibernate

    4. **定义DAO层**:使用Spring的HibernateTemplate或JdbcTemplate,编写数据访问对象(DAO),实现对数据库的操作。 5. **定义Service层**:创建业务服务接口和实现,使用Spring的@Autowired注解注入DAO,封装业务...

    webservice client (springmvc +mybatis+mysql +cxf )

    4. **创建DAO层**:定义DAO(数据访问对象)接口,实现与数据库的交互,使用MyBatis的SqlSession进行操作。 5. **构建Service层**:设计业务逻辑服务接口和实现,调用DAO层的方法,完成业务处理。 6. **配置...

    spring4.1+mybatis+CXF最新webservice DEMO

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。在本DEMO中,MyBatis被用于实现数据库操作,提供灵活的SQL映射和事务管理...

    Xfire配置Web Service+Spring+Hibernate详细配置流程

    然后,定义一个服务接口和实现,使用Spring的`@WebService`注解标记接口,`@Endpoint`注解标记服务实现类。同时,配置WSDL文件生成和发布,以便客户端能够发现和调用服务。 6. **测试与调试**: 使用JUnit进行单元...

    spring4+mybatis3+webservice+cxf框架整合

    MyBatis允许开发者将SQL语句直接写在XML配置文件或注解中,使得数据库操作更加直观,降低了DAO层的复杂性。它还支持动态SQL,可以根据业务需求灵活构建查询条件。 接下来,WebService是一种通过网络进行通信的标准...

    cxf结合spring实现webservice

    2. **定义服务接口和实现**:编写业务接口,使用JAX-WS的`@WebService`注解标记。然后,创建接口的实现类,这将作为实际的服务提供者。 3. **服务组件注册**:在Spring配置文件中,通过`jaxws:endpoint`或`jaxrs:...

    ssm webservice,新手可以参考,不错的参考价值

    总的来说,SSM Webservice的学习涵盖了Java Web开发的基础,包括Spring的依赖注入、AOP和事务管理,SpringMVC的请求处理,MyBatis的数据库操作,以及Webservice的创建、调用和集成。掌握这些知识点,对于提升Java ...

    flex+hibernate+Spring

    - 利用Flex的RemoteObject或WebService组件来调用Spring服务,从而间接访问Hibernate的持久化功能。 3. **Spring与Hibernate的整合**: - 配置Hibernate的SessionFactory,在Spring应用上下文中声明一个bean。 -...

    cxf+spring使用经验

    3. **定义服务接口**:使用 `@WebService` 注解声明 Web 服务接口,例如 `IHelloWorld`,并实现相应的业务逻辑。 ```java @WebService //注释为webservice服务暴露的接口 public interface IHelloWorld { public ...

    CXF3.0.2+Spring3.2.14 WebService入门实例四

    7. **Spring配置**:在`applicationContext.xml`中,我们将定义Spring的bean,包括CXF的服务实现、数据访问对象(DAO)以及业务逻辑层(Service)。 8. **服务接口与实现**:创建一个@WebService注解的接口,声明...

    mvn+spring+mybatis+java6ws

    【标题】"mvn+spring+mybatis+java6ws" 涉及的主要知识点是构建Web项目的现代技术栈,包括Maven项目管理工具、Spring框架、MyBatis持久层框架以及基于Java 6的WebService服务。让我们逐一深入探讨这些技术。 1. ...

    spring-3.1.2、cxf-3.1.3、mybaties、mysql 整合实现webservice需要的完整jar文件

    在Spring中,MyBatis可以通过Spring的DataSource和SqlSessionFactoryBean进行集成,实现数据访问对象(DAO)的自动创建和事务管理。 4. **MySQL**:MySQL是一种流行的开源关系型数据库管理系统,广泛应用于Web应用...

    CXF+Spring 完整版例子

    【标题】"CXF+Spring 完整版例子"是一个示例项目,它演示了如何在Spring框架中集成Apache CXF来构建一个完整的Web服务应用。Apache CXF是一个开源服务框架,它允许开发者创建和消费各种不同类型的Web服务,包括SOAP...

    springwebservice

    Spring可以很方便地与JAX-WS集成,通过`@WebService`注解标记服务接口,并使用`JAXWSExporter`来发布服务。 5. **配置与部署**:在项目的配置文件(如`web.xml`)中,我们需要定义Servlet来处理JAX-WS请求。同时,...

    Rest输出Json的WebService项目实例

    本项目实例“Rest输出Json的WebService项目”便是一个展示如何利用RESTful接口发送和接收JSON数据的实例,其中整合了MyBatis和Spring两大框架,提供了一个完整的解决方案。 1. RESTful API设计:REST的核心思想是...

Global site tag (gtag.js) - Google Analytics