2016-05-04 16 views
0

Dies ist die Serviceklasse. Ich erstelle eine XML-Datei, indem ich den Wert aus der Datenbank lese. Code verwendet drei weitere Pojo-Klassen. Mt700, Header und Swift Details. MT700 ist Hauptklasse für Header und schnelle Details. Problem ist, dass ich alles einmal speichern kann. Egal wie viele Datenzeilen ich habe, wenn die Datei mit einem Datensatz generiert wird, hat sie nur einen Header und eine schnelle Details. Wie kann ich das in Schleife machen? Ich denke, ich muss Liste verwenden, aber ich bin mir nicht sicher, wie man es benutzt, damit es funktioniert.Erstellen einer XML-Datei aus Java jaxB

public void generateEliteExtracts(int trdCustomerKy, Date lastRunDate, Date currentDate) throws TradeException { 
      FileOutputStream fout = null; 
      try { 

          MT700 mt700 = getMT700(trdCustomerKy,lastRunDate,currentDate); 
          if (null != mt700){ 
          StringBuffer fileName = new StringBuffer(1024); 
          fileName.append(mConfiguration.getOutDirectory()).append(MT700_MSGTYPE) 
            .append(DOT).append(mConfiguration.getOutputFileExtn()); 
          smLog.debug("Generated Extract for BankRef" + fileName.toString()); 
          mTracer.log("Generated Extract for BankRef" + fileName.toString()); 
          File xmlFile = new File(fileName.toString()); 
          fout = new FileOutputStream(xmlFile); 
          fout.write(MT700_XMLHEADER.getBytes()); 
          JAXBContext jaxbContext = JAXBContext.newInstance(MT700.class); 
          Marshaller marshaller = jaxbContext.createMarshaller(); 
          marshaller.setProperty(Marshaller.JAXB_ENCODING, ENCODING_ASCII); 
          marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
          marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE); 
          marshaller.setProperty("com.sun.xml.internal.bind.xmlDeclaration", Boolean.FALSE); 
          marshaller.marshal(mt700, fout); 
          IOUtils.closeQuietly(fout); 
          } 
     }catch(

     Exception ex) 

     { 
      smLog.error("Caught unexpected error while creating extracts. ", ex); 
      throw new TradeException("Caught unexpected error while creating extracts.", ex); 
     } finally 

     { 
      IOUtils.closeQuietly(fout); 
     } 

     } 

     private MT700 getMT700(int trdCustomerKy, Date lastRunDate, Date currentDate) throws TradeException { 
      MT700 mt700 = new MT700(); 

      AbInBevEliteExtractDAO dao = new AbInBevEliteExtractDAO(mConnection); 
      CompanyCodesHelper ccHelper = new CompanyCodesHelper(mConnection); 
      String cifCodes = ccHelper.getDescription(trdCustomerKy, "CIF Codes", "CIF Codes"); 
      if (false == TradeUtil.isStringNull(cifCodes)) { 
       mTracer.log("Fetching records for CIFs: " + StringUtils.replace(cifCodes, PIPE, COMMA)); 
       String[] codes = StringUtils.split(cifCodes, PIPE); 
       List<ExportAdvicesData> exportList = dao.getExportAdvices(trdCustomerKy, lastRunDate, currentDate, codes); 
       for (int i = 0; i < exportList.size(); i++) { 

        ExportAdvicesData exportData = exportList.get(i); 

        if ("XXLC".equalsIgnoreCase(exportData.getDocAcronym())) { 
         Header header = new Header(); 
         header.setMessageType("N"); 
         header.setVersionNo("1.0"); 
         header.setRevisionNo("00"); 
         header.setDocumentDate(DateUtil.formatDate(new Date(), DATE_FORMAT_YYYY_MM_DD_HHMMSS)); 
         header.setBankId("BOA" + StringUtils.substring(exportData.getCustRef(), 0, 4)); 
         header.setCustId("XOM"); 
         SwiftDetails swiftTest = new SwiftDetails(); 
         header.setDocumentType(MT700_MSGTYPE); 

         SwiftParserBankDocs parser = new SwiftParserBankDocs(exportData.getDocumentContent()); 

         String bankRef = parser.getTagValue("21"); 
         String custRef = parser.getTagValue("20"); 

         if (TradeUtil.isStringNull(bankRef)) { 
          header.setCustRefNo("NONREF"); 
          header.setBankRefNo(custRef); 
         } else { 
          header.setCustRefNo(custRef); 
          header.setBankRefNo(bankRef); 
         } 

         swiftTest.setTAG_27("1/1"); 
         swiftTest.setTAG_20(custRef); 
         swiftTest.setTAG_23(EMPTY_STRING); 
         String issueDate = parser.getTagValue("31C"); 
         swiftTest.setTAG_31C(getDateInYYMMDD(issueDate)); 
         swiftTest.setTAG_40E("UCP LATEST VERSION"); 
         String datePlaceOfExpiry = parser.getTagValue("31D"); 
         swiftTest.setTAG_31D(getFormattedDatePlaceOfExpiry(datePlaceOfExpiry)); 
         swiftTest.setTAG_50(parser.getTagValue("50")); 
         swiftTest.setTAG_59(parser.getTagValue("59")); 
         swiftTest.setTAG_32B(getCurrencyCdAmount(parser.getTagValue("32B"))); 
         if (false == TradeUtil.isStringNull(exportData.getPositiveTolerance())) { 
          swiftTest.setTAG_39A(
            exportData.getPositiveTolerance() + "/" + exportData.getPositiveTolerance()); 
         } else { 
          swiftTest.setTAG_39A(EMPTY_STRING); 
         } 
         swiftTest.setTAG_39B(EMPTY_STRING); 
         swiftTest.setTAG_39C(EMPTY_STRING); 
         swiftTest.setTAG_41A(parser.getTagValue("41D")); 
         String tag42A = parser.getTagValue("42A"); 
         swiftTest.setTAG_42A(tag42A); 
         if (TradeUtil.isStringNull(tag42A)) { 
          swiftTest.setTAG_42A(parser.getTagValue("42D")); 
         } 

         swiftTest.setTAG_42C(parser.getTagValue("42C")); 
         swiftTest.setTAG_42M(parser.getTagValue("42M")); 
         swiftTest.setTAG_42P(parser.getTagValue("42P")); 
         swiftTest.setTAG_43P(parser.getTagValue("43P")); 
         swiftTest.setTAG_43T(parser.getTagValue("43T")); 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44A")))) { 
          swiftTest.setTAG_44A(parser.getTagValue("44A")); 
         } 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44B")))) { 
          swiftTest.setTAG_44B(parser.getTagValue("44B")); 
         } 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44E")))) { 
          swiftTest.setTAG_44E(parser.getTagValue("44E")); 
         } 

         if (!(TradeUtil.isStringNull(parser.getTagValue("44F")))) { 
          swiftTest.setTAG_44F(parser.getTagValue("44F")); 
         } 

         Date latestShipDate = exportData.getLatestShipDate(); 
         if (null != latestShipDate) { 
          swiftTest.setTAG_44C(DateUtil.formatDate(latestShipDate, DATE_FORMAT_YYMMDD)); 
         } else { 
          swiftTest.setTAG_44C(EMPTY_STRING); 
         } 
         swiftTest.setTAG_44D(parser.getTagValue("44D")); 

         swiftTest.setTAG_45A(parser.getTagValue("45") + BLANK_STRING + parser.getTagValue("45A") 
           + BLANK_STRING + parser.getTagValue("45B")); 
         swiftTest.setTAG_46A(parser.getTagValue("46") + BLANK_STRING + parser.getTagValue("46A") 
           + BLANK_STRING + parser.getTagValue("46B")); 
         swiftTest.setTAG_47A(parser.getTagValue("47") + BLANK_STRING + parser.getTagValue("47A") 
           + BLANK_STRING + parser.getTagValue("47B")); 
         swiftTest.setTAG_71B(parser.getTagValue("71B")); 
         swiftTest.setTAG_48(parser.getTagValue("48")); 
         swiftTest.setTAG_49(parser.getTagValue("49")); 
         swiftTest.setTAG_50B(EMPTY_STRING); 
         swiftTest.setTAG_51A(EMPTY_STRING); 

         String issuingBank = parser.getAddress(SwiftParserBankDocs.ISSUING_BANK); 
         if (TradeUtil.isStringNull(issuingBank)) { 
          String errorMsg = "Issuing Bank address not found in bankdoc text, SWIFT content is possibly invalid, skipped processed record: " 
            + exportData.getCustRef(); 
          smLog.error(errorMsg); 
          mTracer.log("ERROR: " + errorMsg); 

         } 
         issuingBank = StringUtils.replace(issuingBank, CRLF, BLANK_STRING + CRLF); 
         swiftTest.setTAG_52A(issuingBank); 
         swiftTest.setTAG_53A(parser.getTagValue("53A")); 
         swiftTest.setTAG_78(parser.getTagValue("78")); 
         swiftTest.setTAG_57A(parser.getAddress("TO:")); 
         swiftTest.setTAG_72(parser.getTagValue("72")); 
         swiftTest.setTAG_40A(parser.getTagValue("40B")); 
         if (parser.is710Advice()) { 
          swiftTest.setTAG_20(parser.getTagValue("21")); 

         } 
         mt700.setSwift700(swiftTest); 
         mt700.setHeader(header); 
        } else if ("XAMD".equalsIgnoreCase(exportData.getDocAcronym())) { 
         Header header = new Header(); 
         header.setMessageType("N"); 
         header.setVersionNo("1.0"); 
         header.setRevisionNo("00"); 
         header.setDocumentDate(DateUtil.formatDate(new Date(), DATE_FORMAT_YYYY_MM_DD_HHMMSS)); 
         header.setBankId("BOA" + StringUtils.substring(exportData.getCustRef(), 0, 4)); 
         header.setCustId("XOM"); 
         SwiftDetails swift = new SwiftDetails(); 
         header.setDocumentType(MT707_MSGTYPE); 
         SwiftParserBankDocs parser = new SwiftParserBankDocs(exportData.getDocumentContent()); 

         String custRef = parser.getTagValue("20"); 
         String bankRef = parser.getTagValue("23"); 

         if (TradeUtil.isStringNull(bankRef)) { 
          header.setBankRefNo("NONREF"); 
         } else { 
          header.setBankRefNo(bankRef); 
         } 
         header.setCustRefNo(custRef); 
         swift.setTAG_20(custRef); 
         swift.setTAG_21(parser.getTagValue("21")); 
         swift.setTAG_23(EMPTY_STRING); 
         String issuingBank = parser.getAddress(SwiftParserBankDocs.ISSUING_BANK); 
         if (TradeUtil.isStringNull(issuingBank)) { 
          String errorMsg = "Issuing Bank address not found in bankdoc text, SWIFT content is possibly invalid, skipped processed record: " 
            + exportData.getCustRef(); 
          smLog.error(errorMsg); 
          mTracer.log("ERROR: " + errorMsg); 
          swift.setTAG_52A(EMPTY_STRING); 
         } else { 
          issuingBank = StringUtils.replace(issuingBank, CRLF, BLANK_STRING + CRLF); 
          swift.setTAG_52A(issuingBank); 
         } 
         swift.setTAG_31C(getDateInYYMMDD(parser.getTagValue("31C"))); 
         swift.setTAG_30(getDateInYYMMDD(parser.getTagValue("30"))); 
         swift.setTAG_26E(parser.getTagValue("26E")); 
         swift.setTAG_59(parser.getTagValue("59")); 
         swift.setTAG_31E(getDateInYYMMDD(parser.getTagValue("31E"))); 
         swift.setTAG_79(parser.getTagValue("79")); 
         swift.setTAG_72(parser.getTagValue("72")); 
         swift.setTAG_32B(getCurrencyCdAmount(parser.getTagValue("32B"))); 
         swift.setTAG_33B(getCurrencyCdAmount(parser.getTagValue("33B"))); 
         swift.setTAG_34B(getCurrencyCdAmount(parser.getTagValue("34B"))); 
         swift.setTAG_39A(parser.getTagValue("39A")); 
         swift.setTAG_39B(parser.getTagValue("39B")); 
         swift.setTAG_39C(parser.getTagValue("39C")); 
         swift.setTAG_44A(parser.getTagValue("44A")); 
         swift.setTAG_44B(parser.getTagValue("44B")); 
         swift.setTAG_44C(parser.getTagValue("44C")); 
         swift.setTAG_44D(parser.getTagValue("44D")); 
         swift.setTAG_44E(parser.getTagValue("44E")); 
         swift.setTAG_44F(parser.getTagValue("44F")); 
         mt700.setHeader(header); 
         mt700.setSwift700(swift); 
        } 


       } 
      } 
      return mt700; 
     } 

Dies ist MT700 POJO-Klasse. In dieser Klasse nenne ich Header und schnelle Details pojo Klassen.

@XmlRootElement(name = "MT700") 
    public class MT700 implements Serializable 
    { 

     /** 
     * serialVersionUID 
     */ 
     private static final long serialVersionUID = 1L; 

     private Header header; 
     private SwiftDetails swift700; 

     private String version = "1.0"; 

     public Header getHeader() 
     { 
      return header; 
     } 

     @XmlElement(name = "Header") 
     public void setHeader(Header header) 
     { 
      this.header = header; 
     } 

     /** 
     * @return the swift700 
     */ 
     public SwiftDetails getSwift700() 
     { 
      return swift700; 
     } 

     @XmlElement(name = "Swift_Details_700") 
     public void setSwift700(SwiftDetails swift700) 
     { 
      this.swift700 = swift700; 
     } 

     public String getVersion() 
     { 
      return version; 
     } 


     @XmlAttribute(name = "Version") 
     public void setVersion(String version) 
     { 
      this.version = version; 
     } 

    } 

Dies ist die Header-Klasse. I-Klasse ähnliche dies zu mögen, die Tags haben und die rasche Detail

@XmlRootElement(name = "Header") 
    @XmlType(propOrder = { "documentType", "messageType", "versionNo", 
      "revisionNo", "documentDate", "bankId", "custId", "custRefNo", 
      "bankRefNo" }) 
    public class Header implements Serializable 
    { 

     private static final long serialVersionUID = 1L; 

     private String documentType; 
     private String messageType; 
     private String versionNo; 
     private String revisionNo; 
     private String documentDate; 
     private String bankId; 
     private String custId; 
     private String custRefNo; 
     private String bankRefNo; 

Ich füge nicht Getter und Setter für diese Klasse der Post einfach

Antwort

0

Sie erstellen eine MT700 Instanz aussieht und dann in diese Schleife werden die Neuzuweisung Sie den Header und schnelle Felder jedes Mal durch die Schleife:

MT700 mt700 = new MT700(); 
for (int i = 0; i < exportList.size(); i++) { 
    ... 
    mt700.setHeader(header); 
    mt700.setSwift700(swift); 
} 

Dies bedeutet, dass das Dokument, das Sie gerade den letzten Header/swift aus der Datenbank-Abfrage zurückgegeben werden ausgibt enthält.

Sie müssen eine oder mehrere dieser drei in eine Liste von einer Art machen. Entweder enthält Ihr MT700 eine Liste von Headern und Swifts, oder Sie möchten eine Liste von MT700s mit jeweils einem Header und einem Swift haben.

Mit anderen Worten, Sie möchten einen vierten Typ haben, der der eigentliche Stamm Ihres XML-Dokuments ist. Dieses Element enthält ein MT700-Element für jede von der Abfrage gefundene Zeile. Jedes MT700-Element hat ein Header-Element und ein Swift-Element.

Also, genauer gesagt, hier ist das, was Sie tun möchten:

@XmlRootElement 
class MT700s { 
    @XmlElement(name = "MT700") 
    private List<MT700> mt700s = new ArrayList<>(); 
    public List<MT700> getMT700s() { return mt700s; } 
    // Etc. 
} 

MT700s mt700s = new MT700s(); 
for (int i = 0; i < exportList.size(); i++) { 
    MT700 mt700 = new MT700(); 
    ... 
    mt700.setHeader(header); 
    mt700.setSwift700(swift); 
    mt700s.getMT700s().add(mt700); 
} 
+0

Das habe ich jetzt die Datei generieren erhält. Ich habe Daten, aber es ist kein XML. Ich habe den LIst erstellt. Bei JAXB bekomme ich jedoch einen Fehler. Scheint JAXB akzeptiert nicht die LIST .... – Sam

+0

Ich bin genau in dieser Situation. Was soll ich machen? http://stackoverflow.com/questions/12139996/how-to-convert-arraylistobject-to-a-xml-using-jaxb – Sam

+0

Die Antwort auf diese Frage sagt Ihnen genau, was Sie tun möchten. Ich werde meine Antwort bearbeiten, um eine genauere Anleitung zu geben. – Rob