在项目开发中,使用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框架创建Web服务,并结合Spring框架的注解进行服务的管理和集成。XFire是一个强大的Java Web Service实现,它允许开发者轻松地创建和消费...
在本项目中,Spring被用来管理服务端的bean,包括数据访问对象(DAO)和业务逻辑层(Service)。它还提供了一个方便的环境来配置和创建WebService服务。 2. **MyBatis**: MyBatis是一个轻量级的持久层框架,它...
6. **创建DAO层**:定义数据访问对象(DAO),使用Spring的`HibernateTemplate`或`JdbcTemplate`进行数据操作。 7. **实现业务逻辑**:在Service层,利用DAO实现业务逻辑,同时可以通过Spring的`@Transactional`注解...
在Spring框架中,注解是实现服务暴露和远程调用(Remoting)的重要方式,它极大地简化了配置,提高了代码的可读性和可维护性。本文将深入探讨如何使用注解来实现Spring中的Remoting服务。 首先,让我们理解什么是...
4. **定义DAO层**:使用Spring的HibernateTemplate或JdbcTemplate,编写数据访问对象(DAO),实现对数据库的操作。 5. **定义Service层**:创建业务服务接口和实现,使用Spring的@Autowired注解注入DAO,封装业务...
4. **创建DAO层**:定义DAO(数据访问对象)接口,实现与数据库的交互,使用MyBatis的SqlSession进行操作。 5. **构建Service层**:设计业务逻辑服务接口和实现,调用DAO层的方法,完成业务处理。 6. **配置...
MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。在本DEMO中,MyBatis被用于实现数据库操作,提供灵活的SQL映射和事务管理...
然后,定义一个服务接口和实现,使用Spring的`@WebService`注解标记接口,`@Endpoint`注解标记服务实现类。同时,配置WSDL文件生成和发布,以便客户端能够发现和调用服务。 6. **测试与调试**: 使用JUnit进行单元...
MyBatis允许开发者将SQL语句直接写在XML配置文件或注解中,使得数据库操作更加直观,降低了DAO层的复杂性。它还支持动态SQL,可以根据业务需求灵活构建查询条件。 接下来,WebService是一种通过网络进行通信的标准...
2. **定义服务接口和实现**:编写业务接口,使用JAX-WS的`@WebService`注解标记。然后,创建接口的实现类,这将作为实际的服务提供者。 3. **服务组件注册**:在Spring配置文件中,通过`jaxws:endpoint`或`jaxrs:...
总的来说,SSM Webservice的学习涵盖了Java Web开发的基础,包括Spring的依赖注入、AOP和事务管理,SpringMVC的请求处理,MyBatis的数据库操作,以及Webservice的创建、调用和集成。掌握这些知识点,对于提升Java ...
- 利用Flex的RemoteObject或WebService组件来调用Spring服务,从而间接访问Hibernate的持久化功能。 3. **Spring与Hibernate的整合**: - 配置Hibernate的SessionFactory,在Spring应用上下文中声明一个bean。 -...
3. **定义服务接口**:使用 `@WebService` 注解声明 Web 服务接口,例如 `IHelloWorld`,并实现相应的业务逻辑。 ```java @WebService //注释为webservice服务暴露的接口 public interface IHelloWorld { public ...
7. **Spring配置**:在`applicationContext.xml`中,我们将定义Spring的bean,包括CXF的服务实现、数据访问对象(DAO)以及业务逻辑层(Service)。 8. **服务接口与实现**:创建一个@WebService注解的接口,声明...
【标题】"mvn+spring+mybatis+java6ws" 涉及的主要知识点是构建Web项目的现代技术栈,包括Maven项目管理工具、Spring框架、MyBatis持久层框架以及基于Java 6的WebService服务。让我们逐一深入探讨这些技术。 1. ...
在Spring中,MyBatis可以通过Spring的DataSource和SqlSessionFactoryBean进行集成,实现数据访问对象(DAO)的自动创建和事务管理。 4. **MySQL**:MySQL是一种流行的开源关系型数据库管理系统,广泛应用于Web应用...
【标题】"CXF+Spring 完整版例子"是一个示例项目,它演示了如何在Spring框架中集成Apache CXF来构建一个完整的Web服务应用。Apache CXF是一个开源服务框架,它允许开发者创建和消费各种不同类型的Web服务,包括SOAP...
Spring可以很方便地与JAX-WS集成,通过`@WebService`注解标记服务接口,并使用`JAXWSExporter`来发布服务。 5. **配置与部署**:在项目的配置文件(如`web.xml`)中,我们需要定义Servlet来处理JAX-WS请求。同时,...
本项目实例“Rest输出Json的WebService项目”便是一个展示如何利用RESTful接口发送和接收JSON数据的实例,其中整合了MyBatis和Spring两大框架,提供了一个完整的解决方案。 1. RESTful API设计:REST的核心思想是...