官方文档: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=" " 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的说明图。可以结合生成的对象理解,这里就不做详细说明
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文件。