Java EDI 相互轉換

官方文檔:https://www.smooks.org/documentation/#ejc---edifact-java-compiler

github地址(多種smooks轉換Demo):https://github.com/smooks/smooks/tree/v1.7.1/smooks-examples

1.首先有一個EDI文件:input-message.edi,以下是EDI文件內容,需要我們轉成java對象

HDR*1*0*59.97*64.92*4.95*Wed Nov 15 13:45:28 EST 2006
CUS*user1*Harry^Fletcher*SD
ORD*1*1*364*The 40-Year-Old Virgin*29.98
ORD*2*1*299*Pulp Fiction*29.99

2.pom.xml 文件導入EDI轉java需要的maven依賴

<dependency>
    <groupId>org.milyn</groupId>
    <artifactId>milyn-smooks-edi</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.milyn</groupId>
    <artifactId>milyn-smooks-javabean</artifactId>
    <version>1.7.1</version>
</dependency>
<dependency>
    <groupId>org.milyn</groupId>
    <artifactId>milyn-smooks-all</artifactId>
    <version>1.7.0</version>
</dependency>
<dependency>
    <groupId>org.milyn</groupId>
    <artifactId>milyn-smooks-ejc</artifactId>
    <version>1.7.1</version>
</dependency>

3.添加EDI內容描述文件  edi-to-java-order-mapping.xml

<?xml version="1.0" encoding="UTF-8"?>
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.3.xsd">

    <medi:description name="DVD Order" version="1.0" />

    <medi:delimiters segment="&#10;" field="*" component="^" sub-component="~" />

    <medi:segments xmltag="Order">

        <medi:segment segcode="HDR" xmltag="header">
            <medi:field xmltag="order-id" />
            <medi:field xmltag="status-code" />
            <medi:field xmltag="net-amount" />
            <medi:field xmltag="total-amount" />
            <medi:field xmltag="tax" />
            <medi:field xmltag="date" />
        </medi:segment>

        <medi:segment segcode="CUS" xmltag="customer-details">
            <medi:field xmltag="username" />
            <medi:field xmltag="name">
                <medi:component xmltag="firstname" />
                <medi:component xmltag="lastname" />
            </medi:field>
            <medi:field xmltag="state" />
        </medi:segment>

        <medi:segment segcode="ORD" xmltag="order-item" maxOccurs="-1">
            <medi:field xmltag="position" />
            <medi:field xmltag="quantity" />
            <medi:field xmltag="product-id" />
            <medi:field xmltag="title" />
            <medi:field xmltag="price" />
        </medi:segment>

    </medi:segments>

</medi:edimap>

4.在pom.xml再引入根據描述文件自動生成對應的java文件的插件

<plugin>
   <groupId>org.milyn</groupId>
   <artifactId>ejc-maven-plugin</artifactId>
   <version>1.7.1</version>
   <configuration>
      <ediMappingFile>src/main/resources/smooks/edi-to-java-order-mapping.xml</ediMappingFile>
      <packageName>com.edi.test.model</packageName>
   </configuration>
   <executions>
      <execution>
         <phase>generate-sources</phase>
         <goals>
            <goal>generate</goal>
         </goals>
      </execution>
   </executions>
</plugin>

5.maven 打包:終端運行 mvn clean install 或者手動點擊打包按鈕,打包完成之後就能在target包下找到根據edi描述文件生成的java文件,然後複製到我們自己的包裏面,爲了方便管理,xml文件放到resource目錄下,

 

複製後--->

 

爲了方便理解 edi-to-java-order-mapping.xml 內容 與 input-message.edi 內容的映射關係,在官網找了張XML的說明圖。可以結合生成的對象理解,這裏就不做詳細說明

Image:Edi-mapping.png

6.因爲配置文件地址改變了,所以代碼裏面引用配置文件的地址也需要修改,其中涉及2個文件:OrderFactory.java 與 bindingconfig.xml

7.添加一個edi文件加載類

package com.edi.test.model;

import org.milyn.Smooks;
import org.milyn.SmooksException;
import org.milyn.container.ExecutionContext;
import org.milyn.io.StreamUtils;
import org.milyn.payload.JavaResult;
import org.milyn.payload.StringResult;
import org.xml.sax.SAXException;

import javax.xml.transform.stream.StreamSource;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * <p>
 *
 * </p>
 * com.edi.test.model.OrderEdiSmookMain
 *
 * @author heruifeng
 * @since 2023/3/24 10:51
 */
public class SmookMain {

    private static byte[] messageIn =readInputMessage();
    public final Smooks smooks;
    public SmookMain() throws IOException, SAXException {
        //Instantiate Smooks with the config...

        smooks = new Smooks(SmookMain.class.getResourceAsStream("/smooks/bindingconfig.xml"));

    }
    public JavaResult runSmooksTransform(ExecutionContext executionContext) throws IOException, SAXException, SmooksException {
        try{//java bean
            JavaResult javaResult = new JavaResult();
            smooks.filterSource(new StreamSource(new ByteArrayInputStream(messageIn)), javaResult);
            return javaResult;
        }finally{
            smooks.close();
        }

    }

    private static byte[] readInputMessage() {
        try{
            return StreamUtils.readStream(SmookMain.class.getResourceAsStream("/smooks/input-message.edi"));
        }catch(IOException e) {
            e.printStackTrace();return "".getBytes();
        }
    }

    private static void pause(String message) {
        try{
            BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
            System.out.print("> " +message);
            in.readLine();
        }catch(IOException e) {
            System.out.println("\n");
        }
    }

    public JavaResult runSmooksTransform() throws IOException, SAXException {
        ExecutionContext executionContext=smooks.createExecutionContext();
        return runSmooksTransform(executionContext);
    }
}

8.添加測試類:

import com.edi.test.model.Order;
import com.edi.test.model.OrderFactory;
import com.edi.test.model.SmookMain;
import org.milyn.container.ExecutionContext;
import org.milyn.payload.JavaResult;
import org.xml.sax.SAXException;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

/**
 * <p>
 *
 * </p>
 * com.edi.Test
 *
 * @author heruifeng
 * @since 2023/3/24 10:59
 */
public class Test {

    public static void main(String[] args) throws IOException, SAXException {
        SmookMain smooksMain = new SmookMain();
        // edi文件轉對象
        ExecutionContext executionContext = smooksMain.smooks.createExecutionContext();
        JavaResult result = smooksMain.runSmooksTransform(executionContext);
        Order Order = (Order) result.getBean("Order");
        // 從對象轉EDI文件
        OrderFactory orderFactory = OrderFactory.getInstance();
        OutputStream os = new FileOutputStream("E:/Freedom/xunyijia/ediFile/createdEDIFile.edi");
        orderFactory.toEDI(Order, new OutputStreamWriter(os));
        System.out.println("Edi file is created from java object");
    }
}

9.運行測試2個功能,一是通過EDI文件獲取java對象,二是通過java對象轉EDI文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章