idoc java_java - 将iDOC从Java发送到SAP - 堆栈内存溢出
我们有从系统生成的iDOC文件。 现在,我们尝试通过RFC连接将它们发送到SAP。 我已经作为客户端建立了RFC连接,但无法发送iDOC!
我试图创建一个样本iDOC进行测试,但是它不起作用!
Exception in thread "main" java.lang.NoSuchMethodError: com.sap.conn.idoc.jco.SAPRepository$ConnectionProvider.execute(Lcom/sap/conn/jco/JCoFunction;Lcom/sap/conn/jco/rt/AbapRepository;)V
at com.sap.conn.idoc.jco.SAPRepository.queryRootSegmentMetaData40(SAPRepository.java:1204)
at com.sap.conn.idoc.jco.SAPRepository.queryRootSegmentMetaData(SAPRepository.java:1110)
at com.sap.conn.idoc.jco.SAPRepository.getRootSegmentMetaData(SAPRepository.java:909)
at com.sap.conn.idoc.rt.DefaultIDocDocument.(DefaultIDocDocument.java:124)
at com.sap.conn.idoc.rt.DefaultIDocDocument.(DefaultIDocDocument.java:61)
at com.sap.conn.idoc.jco.JCoIDocDocument.(JCoIDocDocument.java:51)
at com.sap.conn.idoc.jco.JCoIDocRuntime.createIDocDocument(JCoIDocRuntime.java:133)
at com.sap.conn.idoc.jco.JCoIDocRuntime.createIDocDocument(JCoIDocRuntime.java:35)
at com.sap.conn.idoc.rt.DefaultIDocRuntime.createIDocDocument(DefaultIDocRuntime.java:175)
at com.sap.conn.idoc.rt.DefaultIDocRuntime.createIDocDocument(DefaultIDocRuntime.java:18)
at com.idoc.sender.IDocClientExample.main(IDocClientExample.java:49)
我什至尝试发送样本iDOC XML,但我也遇到了另一个错误,试图多次更改XML,但是我又一次遇到了同样的问题!
com.sap.conn.idoc.IDocParseException: (7) IDOC_ERROR_PARSE_FAILURE: Invalid character encountered in XML input data source:
state=READING_XMLDECLARATION, charPosition=14, lineNumber=1, columnNumber=15, invalidChar=U+003D,
sourceSnippet=...@<?xml version="1.0" encoding="UTF-8"?>20120114120000
^
at com.sap.conn.idoc.rt.xml.DefaultIDocXMLParser.throwIDocParseException(DefaultIDocXMLParser.java:2223)
at com.sap.conn.idoc.rt.xml.DefaultIDocXMLParser.parseProlog(DefaultIDocXMLParser.java:1635)
at com.sap.conn.idoc.rt.xml.DefaultIDocXMLParser.parse(DefaultIDocXMLParser.java:320)
at com.sap.conn.idoc.rt.xml.DefaultIDocXMLProcessor.parse(DefaultIDocXMLProcessor.java:112)
at com.sap.conn.idoc.rt.xml.DefaultIDocXMLProcessor.parse(DefaultIDocXMLProcessor.java:54)
at com.sap.conn.idoc.rt.xml.DefaultIDocXMLProcessor.parse(DefaultIDocXMLProcessor.java:31)
at com.idoc.sender.IDocClientExample.main(IDocClientExample.java:57)
这是我用来创建iDOC和发送iDOC XML的代码:
package com.idoc.sender;
import com.sap.conn.idoc.*;
import com.sap.conn.idoc.jco.JCoIDoc;
import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoDestinationManager;
import java.io.BufferedReader;
import java.io.FileReader;
public class IDocClientExample {
public static void main(String[] args) {
try {
String iDocXML = null;
FileReader fileReader;
try {
fileReader = new FileReader("TestSalesOrder.xml");
BufferedReader br = new BufferedReader(fileReader);
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
iDocXML = sb.toString();
br.close();
fileReader.close();
} catch (Exception ex) {
ex.printStackTrace();
}
// see provided configuration file xxxx.jcoDestination
JCoDestination destination = JCoDestinationManager.getDestination("xxxx");
IDocRepository iDocRepository = JCoIDoc.getIDocRepository(destination);
String tid = destination.createTID();
IDocFactory iDocFactory = JCoIDoc.getIDocFactory();
System.out.println(destination.getAttributes());
// a) create sample new idoc
IDocDocument doc = iDocFactory.createIDocDocument(iDocRepository, "SYSTAT01");
IDocSegment segment = doc.getRootSegment();
segment.addChild("E1MARAM");
JCoIDoc.send(doc, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid);
// b) use existent xml file
IDocXMLProcessor processor = iDocFactory.getIDocXMLProcessor();
IDocDocumentList iDocList = processor.parse(iDocRepository, iDocXML);
JCoIDoc.send(iDocList, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid);
destination.confirmTID(tid);
} catch (Exception e) {
e.printStackTrace();
}
System.out.print("program end");
}
}
// a) create sample new idoc
IDocDocument doc = iDocFactory.createIDocDocument(iDocRepository, "SYSTAT01");
IDocSegment segment = doc.getRootSegment();
segment.addChild("E1MARAM");
JCoIDoc.send(doc, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid);
// b) use existent xml file
IDocXMLProcessor processor = iDocFactory.getIDocXMLProcessor();
IDocDocumentList iDocList = processor.parse(iDocRepository, iDocXML);
JCoIDoc.send(iDocList, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid);
destination.confirmTID(tid);
} catch (Exception e) {
e.printStackTrace();
}
System.out.print("program end");
}
}
这是我的连接文件:
jco.client.lang=EN
jco.client.client=100
jco.client.passwd=xxxx
jco.client.user=xxxx
jco.client.sysnr=01
jco.client.ashost=xxxx
这是我的xml文件:
20120114120000DEBMAS06
DEBMAS
HTTPDEMO
LS
HTTPDEMO
SAPxxx
LS
xxxCLNT100
47
Test Customer
0004
TEST
City
PL
A
L
Street
我正在使用sapjco3-x86-64bit-3.0.5和sapidoc-3.0.1!
测试iDOC的创建并发送IDOC XML仅用于测试,但在本例中,我们已经准备好了iDOC!
我的问题是,如何通过RFC将iDOC 从磁盘直接发送到SAP? 如果无法这样做,如何解决创建iDOC或发送iDOC XML的错误? 我的第二个问题,一旦我能够发送iDOC,是否必须建立一个新的SERVER RFC连接,以便可以从SAP接收iDOC?
** 编辑 **
现在,我可以正确发送和接收IDoc。 我的问题是如何将IDoc作为Flat IDoc获得 。
我可以使用以下代码将IDoc作为XML IDoc接收:
package com.idoc.actif;
import com.sap.conn.idoc.IDocDocumentList;
import com.sap.conn.idoc.IDocXMLProcessor;
import com.sap.conn.idoc.jco.*;
import com.sap.conn.jco.server.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class IDocServerExample
{
public static void main(String[] a)
{
try
{
// see provided examples of configuration files xxxx.jcoServer and xxxx.jcoDestination
JCoIDocServer server = JCoIDoc.getServer("xxxx");
server.setIDocHandlerFactory(new MyIDocHandlerFactory());
server.setTIDHandler(new MyTidHandler());
MyThrowableListener listener = new MyThrowableListener();
server.addServerErrorListener(listener);
server.addServerExceptionListener(listener);
//server.setConnectionCount(1);
server.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
static class MyIDocHandler implements JCoIDocHandler
{
public void handleRequest(JCoServerContext serverCtx, IDocDocumentList idocList)
{
FileOutputStream fos=null;
OutputStreamWriter osw=null;
try
{
//receiving XML IDoc, how to get the IDoc as a Flat IDoc (SAP is sending the IDoc as Flat)???
IDocXMLProcessor xmlProcessor = JCoIDoc.getIDocFactory().getIDocXMLProcessor();
fos=new FileOutputStream(serverCtx.getTID());
osw=new OutputStreamWriter(fos, "UTF8");
xmlProcessor.render(idocList, osw, IDocXMLProcessor.RENDER_WITH_TABS_AND_CRLF);
osw.flush();
}
catch (Throwable thr)
{
thr.printStackTrace();
}
finally
{
try
{
if (osw!=null)
osw.close();
if (fos!=null)
fos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
static class MyIDocHandlerFactory implements JCoIDocHandlerFactory
{
private JCoIDocHandler handler = new MyIDocHandler();
public JCoIDocHandler getIDocHandler(JCoIDocServerContext serverCtx)
{
return handler;
}
}
static class MyThrowableListener implements JCoServerErrorListener, JCoServerExceptionListener
{
public void serverErrorOccurred(JCoServer server, String connectionId, JCoServerContextInfo ctx, Error error)
{
System.out.println(">>> Error occured on " + server.getProgramID() + " connection " + connectionId);
error.printStackTrace();
}
public void serverExceptionOccurred(JCoServer server, String connectionId, JCoServerContextInfo ctx, Exception error)
{
System.out.println(">>> Error occured on " + server.getProgramID() + " connection " + connectionId);
error.printStackTrace();
}
}
static class MyTidHandler implements JCoServerTIDHandler
{
public boolean checkTID(JCoServerContext serverCtx, String tid)
{
System.out.println("checkTID called for TID="+tid);
return true;
}
public void confirmTID(JCoServerContext serverCtx, String tid)
{
System.out.println("confirmTID called for TID="+tid);
}
public void commit(JCoServerContext serverCtx, String tid)
{
System.out.println("commit called for TID="+tid);
}
public void rollback(JCoServerContext serverCtx, String tid)
{
System.out.print("rollback called for TID="+tid);
}
}
}
idoc java_java - 将iDOC从Java发送到SAP - 堆栈内存溢出相关推荐
- linux下java调用python脚本,java - 在Linux Terminal中以编程方式从Java调用python脚本 - 堆栈内存溢出...
我正在开发一个Java应用程序,用于检查源文件中的补丁程序(是否存在). 用于检测补丁程序更改的核心逻辑位于python脚本[titled'patch.py']中,并且我的Java应用程序与此Py ...
- java 处理byte_java - 文件到Java中的byte [] - 堆栈内存溢出
===============>>#1 票数:1222 例: import java.io.File; import java.nio.file.Files; File file; // ...
- java ftp上传超时_java - Java FTP连接超时 - 堆栈内存溢出
我正在做一个项目,修改后,稍后会将一些文件上传到FTP服务器...除了弄清楚文件的上传之外,我什么都没有. 我可以成功连接到FTP服务器,但是一旦文件上传,该程序将挂起几分钟,然后显示超时. java ...
- JAVA中数字格式异常,java - Java数字格式异常 - 堆栈内存溢出
当我遇到NumberFormatException时,我正在CodeChef平台上解决问题. 首先,我使用Scanner处理输入,然后使用BufferedReader . 但是他们都不起作用! 这是我 ...
- java web空指针,java - Web服务中的Java空指针异常@autowired [重复] - 堆栈内存溢出
错误:domain.SpeakerRecog.test上的java.lang.NullPointerException SpeakerMapper为null, speakermapper.insert ...
- raspberry pi java8_java - Raspberry PI 2 Java 8 JVM错误 - 堆栈内存溢出
我正在构建基于Java 1.8,spring,hibernate,mysql的Web应用程序,并使用tomcat作为Web服务器. 现在我的应用正在记录(每隔5秒)树莓的系统数据,例如: cpu温度, ...
- java输出钻石_java - 用Java打印钻石形状 - 堆栈内存溢出
我想在Eclipse的输出控制台上打印网格形状. 基本上,我从用户那里得到一个整数,它是网格单个边框中的星星数. 这里是我到目前为止的代码: import java.util.Scanner; pub ...
- drawrect java_java - g.drawRect在背景后面绘制矩形 - 堆栈内存溢出
我想提出一种清除屏幕的方法. 我试着做repaint(); 我看到它在另一个代码中起作用. 现在,我正在尝试执行g.drawRect但是它将其绘制在背景后面( 程序看起来像什么 ). 我做了一个明确的 ...
- opencv java 去干扰_java - OpenCV Java修补图像格式要求 - 堆栈内存溢出
一直试图让修复工作在Android上进行, int height = (int) viewMat.size().height; int width = (int) viewMat.size().wid ...
最新文章
- Android Handler、Loop 的简单使用
- 开机自启动win7计划任务
- Linux Vim 光标错位,技术|Vim 复制粘帖格式错乱问题的解决办法
- “直播带货”还能火多久?
- kaggle实战—泰坦尼克(二、数据清洗及特征处理)
- android系统换动画,Android Activity动画跳转修改
- MDI窗体关闭问题解决一例
- python文件、存储、压缩
- 【CV学习笔记】OpenCV基本操作
- hulu dpp_如何将Hulu视频下载到您的PC以便离线观看
- NVR和DVR有什么区别_NVR和DVR哪个好 IP Camera
- Borůvka (Sollin) 算法求 MST 最小生成树
- 用js处理图片加载错误时加载默认图片的方法
- Java通过HAPI解析HL7消息
- 最新 EDK2 实验
- gradle迁到kts, 以及module管理
- 基于若依系统进行模块化开发(使用eclipse)
- web服务器的开发(简易版本)
- PAZU WEB打印控件
- 人物介绍的排版【小白进】
热门文章
- bootstrap后台管理系统前后台实现(含数据库)
- openWRT摄像头选购
- 如何安排初一的课程表
- atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源
- 【C语言】警告:“scanf_s”: 没有为格式字符串传递足够的参数
- 【luogu CF1569D】Inconvenient Pairs(思维)
- python结构方程模型_结构方程模型:方法与应用_结构方程模型公式
- windows安装perl及komodo IDE的详细步骤
- linux如何编译Intel网卡驱动源码,并进行安装
- Vue安装及创建第一个Vue项目