cancel
Showing results for 
Search instead for 
Did you mean: 

Erro resposta B2B GRC (REQU_NAME_PARSER_ERROR)

deborauchoa
Participant
0 Kudos

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.

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Debora,

Aparentemente o erro é de parse do XML, certifique-se que o XML no payload de entrada é um XML valido.

Abços

deborauchoa
Participant
0 Kudos

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;

  }

}

Former Member
0 Kudos

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

deborauchoa
Participant
0 Kudos

Obrigada André.

Vou testar esse trecho de código e posto aqui o resultado.

Mais uma vez obrigada.

deborauchoa
Participant
0 Kudos

Oi André,

o trecho de código funcionou! Meu erro agora é outro.

Former Member
0 Kudos

Débora, boa noite.

Você está entregando um payload do tipo Mail no proxy NFB2B_procNFe_IB.

Verifique o documento abaixo, pode te ajudar:

Abs,

André Canalles

deborauchoa
Participant
0 Kudos

Oi André,

obrigada mais uma vez por responder. Configurei o standard e funciona corretamente. Somente com o module é gerado esse erro. E para testes estou enviando somente o xml.

Obrigada.

Answers (0)