博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring集成hessian遇到的大坑
阅读量:5346 次
发布时间:2019-06-15

本文共 6057 字,大约阅读时间需要 20 分钟。

今天在使用Spring+hessian访问远程服务的时候,遇到两个问题,使用 Spring版本是4.3.6.RELEASE。

首先在Spring-servlet.xml里配置的hessian的bean:

${portalUrl}
根据环境(sit\pre\prd)配置在配置文件中配置
portalUrl=http://xxx/xxx-web/RemoteApi/remotePortalService
在xml中使用:
来加载properties文件。
对应的bean实现:
@Controller@RequestMapping("/romote")public class PermissionControllor extends BaseCTBPMController {    @Autowired    private PortalService remotePortalService;    @Autowired    private ProductsConverter productsConverter;    /**     * 根据用户编号查询该用户能访问的产品     *     * @param request     */    @RequestMapping("/api/product.do")    @Action(type = ViewType.API, name = "getUserProducts")    public Object getUserProducts(HttpServletRequest request, HttpServletResponse response) {        UserEntity user = getUserEntity(request);        List
productDTOS = new ArrayList<>(); if (user == null) { List
userProducts = remotePortalService.getProducts("6f80bbbfc7d6442e80b9553f0a024b43"); productDTOS = productsConverter.convertToDTOs(userProducts); } return productDTOS; }}
遇到的问题: 1、当使用hessian的依赖为:
com.caucho
hessian
3.1.5
的时候,会报错:java.lang.ClassNotFoundException: com.caucho.hessian.client.HessianConnectionFactory,报错很明显是版本低了 2、当使用hessian的依赖为:
com.caucho
hessian
4.0.7
的时候,会报错:com.caucho.hessian.io.HessianProtocolException: expected integer at 0x74,很明显版本问题, 然后折腾了半天都没有找到合适的处理方法,但是知道的是使用Spring-3.1.2.RELEASE+3.1.5的hessian是没有问题的。实在是找不到问题所在,然后就放弃了使用Spring集成的HessianProxyFactoryBean来访问远程服务。 改为使用hessian的HessianProxyFactory来处理: 直接上代码:
com.caucho
hessian
4.0.37
javax.servlet
servlet-api
mirror.caucho
hessian
0.1-3_1_5
javax.servlet
servlet-api
在Spring-servlet.xml中:
classpath:conf/main-setting-$[envName].properties
来加载配置文件。 读取配置文件:
import lombok.Data;import org.apache.commons.fileupload.FileUpload;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Component("fileUpload")@Datapublic class RemoteServiceProperties extends FileUpload {    private String portalUrl;    @Value("#{prop.portalUrl}")    public void setPortalUrl(String portalUrl) {        this.portalUrl = portalUrl;    }}
注解形式来连接远程:
import com.suning.skyeye.intf.remote.PortalService;import lombok.extern.slf4j.Slf4j;import mirror.caucho.hessian.client.HessianProxyFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.net.MalformedURLException;/** * @author */@Configuration@Slf4jpublic class RemoteServiceConfiguration {    @Autowired    private RemoteServiceProperties remoteServiceProperties;    @Bean("remotePortalService")    public PortalService remotePortalService() throws MalformedURLException {        HessianProxyFactory proxyFactory = new HessianProxyFactory();        return (PortalService) proxyFactory.create(PortalService.class, remoteServiceProperties.getPortalUrl());    }}
调用类:
import com.suning.ctbpm.dto.user.ProductDTO;import com.suning.ctbpm.entity.UserEntity;import com.suning.ctbpm.web.controller.base.BaseCTBPMController;import com.suning.ctbpm.web.converter.ProductsConverter;import com.suning.framework.ViewType;import com.suning.framework.annotation.Action;import com.suning.skyeye.intf.entity.ProductEo;import com.suning.skyeye.intf.remote.PortalService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.ArrayList;import java.util.List;@Controller@RequestMapping("/romote")public class PermissionControllor extends BaseCTBPMController {    @Autowired    private PortalService remotePortalService;    @Autowired    private ProductsConverter productsConverter;    /**     * 根据用户编号查询该用户能访问的产品     *     * @param request     */    @RequestMapping("/api/product.do")    @Action(type = ViewType.API, name = "getUserProducts")    public Object getUserProducts(HttpServletRequest request, HttpServletResponse response) {        UserEntity user = getUserEntity(request);        List
productDTOS = new ArrayList<>(); if (user == null) { List
userProducts = remotePortalService.getProducts("6f80bbbfc7d6442e80b9553f0a024b43"); productDTOS = productsConverter.convertToDTOs(userProducts); } return productDTOS; }
import com.suning.ctbpm.dto.user.ProductDTO;import com.suning.ctbpm.util.BaseConverter;import com.suning.skyeye.intf.entity.ProductEo;import org.springframework.stereotype.Component;@Componentpublic class ProductsConverter extends BaseConverter
{ @Override protected ProductEo doForward(ProductDTO productDTO) { throw new UnsupportedOperationException("Not supported yet."); } @Override protected ProductDTO doBackward(ProductEo productEo) { return new ProductDTO().setAppCode(productEo.getProductCode()).setAppName(productEo.getDescription()); }}}
就可以正常访问远程接口了。
这里主要要理解hessian和Spring加载配置文件。

作者:敲完代码好睡觉

本文版权归作者所有,欢迎转载,请在文章页面明显位置给出原文连接:https://www.cnblogs.com/wynjauu/articles/9360570.html

转载于:https://www.cnblogs.com/wynjauu/articles/9204487.html

你可能感兴趣的文章
Zookeeper一致性级别
查看>>
Linux远程登录
查看>>
Linux自己安装redis扩展
查看>>
HDU 1016 Prime Ring Problem(dfs)
查看>>
C#中结构体与字节流互相转换
查看>>
session和xsrf
查看>>
Linux目录结构
查看>>
luoguP3414 SAC#1 - 组合数
查看>>
五一 DAY 4
查看>>
(转)接口测试用例设计(详细干货)
查看>>
【译】SSH隧道:本地和远程端口转发
查看>>
图片点击轮播(三)-----2017-04-05
查看>>
直播技术细节3
查看>>
《分布式服务架构:原理、设计于实战》总结
查看>>
java中new一个对象和对象=null有什么区别
查看>>
字母和数字键的键码值(keyCode)
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
Spring mvc初学
查看>>
有意思的代码片段
查看>>
C8051开发环境
查看>>