on 06-03-2014 3:31 PM
Prezados,
Após realizar as configurações e criar o module para o B2B inbound no PI, estou tendo o seguinte erro na SXI_MONITOR do GRC:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
- <!-- Call Adapter
-->
- <SAP:Error SOAP:mustUnderstand="1" xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<SAP:Category>XIServer</SAP:Category>
<SAP:Code area="INTERNAL">REQU_NAME_PARSER_ERROR</SAP:Code>
<SAP:P1 />
<SAP:P2 />
<SAP:P3 />
<SAP:P4 />
<SAP:AdditionalText />
<SAP:Stack>Erro na geração da análise sintática para a determinação do nome da requisição Fehler beim Parsen eines XML-Streams: 'BOM / charset detection failed'.</SAP:Stack>
<SAP:Retry>M</SAP:Retry>
</SAP:Error>
Alguém já passou por isso e pode me ajudar?
Obrigada.
Debora,
Aparentemente o erro é de parse do XML, certifique-se que o XML no payload de entrada é um XML valido.
Abços
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Oi Mariano,
de fato meu XML está chegando de forma errada no GRC:
Como pode ser visto na imagem abaixo, o ? esta sendo colocado na frente da tag <?xml, gerando o erro informado acima.
O XML chega corretamente na moni do PI.
Segue o código usado para as libs e o fonte do module:
com.sap.aii.af.cpa.svc.api
com.sap.aii.af.ms.ifc_api
com.sap.aii.af.svc_api
com.sap.aii.af.lib.mod
package com.sap.pi.com;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.Random;
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import com.sap.aii.af.lib.mp.module.Module;
import com.sap.aii.af.lib.mp.module.ModuleContext;
import com.sap.aii.af.lib.mp.module.ModuleData;
import com.sap.aii.af.service.auditlog.Audit;
import com.sap.engine.interfaces.messaging.api.Message;
import com.sap.engine.interfaces.messaging.api.MessageKey;
import com.sap.engine.interfaces.messaging.api.Payload;
import com.sap.engine.interfaces.messaging.api.auditlog.AuditLogStatus;
/**
* @ejbHome <{com.sap.aii.af.mp.module.ModuleHome}>
* @ejbLocal <{com.sap.aii.af.mp.module.ModuleLocal}>
* @ejbLocalHome <{com.sap.aii.af.mp.module.ModuleLocalHome}>
* @ejbRemote <{com.sap.aii.af.mp.module.ModuleRemote}>
* @stateless
*/
public class ReadMultipleAttachment implements SessionBean, Module {
private SessionContext myContext;
public void ejbRemove() {
}
public void ejbActivate() {
}
public void ejbPassivate() {
}
public void setSessionContext(SessionContext context) {
myContext = context;
}
public void ejbCreate() throws CreateException {
}
// Method descriptor #12 (Lcom/sap/aii/af/mp/module/ModuleContext;Lcom/sap/aii/af/mp/module/ModuleData;)Lcom/sap/aii/af/mp/module/ModuleData;
//public abstract com.sap.aii.af.mp.module.ModuleData process(com.sap.aii.af.mp.module.ModuleContext arg0, com.sap.aii.af.mp.module.ModuleData arg1) throws com.sap.aii.af.mp.module.ModuleException;
//com.sap.engine.services.ejb3.container.ActionException: Cannot find business method 'process' with args [interface com.sap.aii.af.lib.mp.module.ModuleContext, class com.sap.aii.af.lib.mp.module.ModuleData] in class com.sap.pi.com.ReadMultipleAttachment for component sap.com/FileModule_EJBEAR*xml|FileModule_EJB.jar*xml|ReadMultipleAttachment
public ModuleData process(ModuleContext moduleContext,
ModuleData inputModuleData) {
Message mailMessage = (Message) inputModuleData.getPrincipalData();
//amk = new MessageKey(msg.getMessageId(),msg.getMessageDirection());
MessageKey amk = new MessageKey(mailMessage.getMessageId(), mailMessage.getMessageDirection());
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING,
"ReadMultipleAttachment >> Entrou no module");
String attachmentText;
String filePath;
Payload attachmentPayload;
// Acessar a lista de anexos
Iterator attachmentIterator = mailMessage.getAttachmentIterator();
try {
while (attachmentIterator.hasNext()) {
// Carregar o anexo do email
attachmentPayload = (Payload) attachmentIterator.next();
if (attachmentPayload.getContentType().indexOf(".xml") > 0) {
// Carregar o conteúdo do anexo xml em formato string
attachmentText = convertStreamToString(attachmentPayload
.getInputStream());
// Montar um nome para o arquivo que será gravado
filePath = getFilePath(attachmentPayload.getContentType(),
attachmentText);
if (filePath.indexOf("discard") < 0) {
// Gravar o arquivo válido no filesystem
BufferedWriter bwriter = new BufferedWriter(
new FileWriter(new File(filePath)));
bwriter.write(attachmentText);
bwriter.close();
} else {
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING,
"O arquivo: "
+ attachmentPayload.getContentType()
+ " da mensagem "
+ mailMessage.getMessageId()
+ " não tem as tags de NFe.");
}
} else {
Audit.addAuditLogEntry(amk, AuditLogStatus.SUCCESS,
"O arquivo: " + attachmentPayload.getContentType()
+ " da mensagem "
+ mailMessage.getMessageId()
+ " foi descartado por não ser xml.");
}
}
} catch (RuntimeException runtimeException) {
runtimeException.printStackTrace();
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING,
"Ocorreu uma runtime exception processando a mensagem "
+ mailMessage.getMessageId() + ": "
+ runtimeException.getMessage());
} catch (Exception generalException) {
generalException.printStackTrace();
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING,
"Ocorreu uma general exception processando a mensagem "
+ mailMessage.getMessageId() + ": "
+ generalException.getMessage());
}
Audit.addAuditLogEntry(amk, AuditLogStatus.WARNING,
"ReadMultipleAttachment << Saiu do module");
return inputModuleData;
}
private String convertStreamToString(InputStream inputStream)
throws IOException {
if (inputStream != null) {
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(
inputStream, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
inputStream.close();
}
return writer.toString();
} else {
return "";
}
}
private String getFilePath(String contentType, String attachmentText) {
String filePath = "";
String fileName;
File file;
// Ler o atributo name e desconsiderar a extensão (que já é conhecida,
// xml)
fileName = contentType.substring(contentType.indexOf("name=") + 6,
contentType.length() - 1).toLowerCase();
// Identificar se o arquivo é de cancelamento ou de entrada pela tag
// raiz (mesma estratégia do standard)
if(attachmentText.indexOf("<nfeProc") > 0){
filePath = "/interfaces/inbox/NFe/";
} else
if(attachmentText.indexOf("<cteProc") > 0){
filePath = "/tmp/notas_grd/";
} else
if (attachmentText.indexOf("<procCancNFe") > 0) {
filePath = "/tmp/notas_grd/cancel/";
}else{
filePath = "/tmp/notas_grd/discard/";
}
// Verificar se o arquivo existe, e adicionar um random no nome do
// arquivo caso já exista
file = new File(filePath + fileName);
if (file.exists() == true) {
Random r = new Random();
return filePath + Long.toString(r.nextLong()) + fileName;
}
return filePath + fileName;
}
}
Débora, bom dia.
Tente utilizar o código abaixo para retirar o cabeçalho(<?xml />) do XML:
Contexto
// Carregar o conteúdo do anexo xml em formato string
attachmentText = convertStreamToString(attachmentPayload.getInputStream());
// Remover assinatura
attachmentText = Signature(attachmentText);
Método
public String Signature(String content) { |
if (content.contains("?>")) | ||
content = content.substring(content.indexOf("?>") + 2); | ||
else | ||
content = content.substring(content.indexOf("<")); |
return content; |
}
Att.,
André Canalles
User | Count |
---|---|
15 | |
4 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.