BeanIO - 如何将抽象类或接口映射为记录或段

问题描述

如何使用BeanIO注解定义一个接口的段? 在我的例子中,我只能获得只有@Field 信息的lineResponse,@Segment 是不可见的。

ParserWriter 结果:

2021051211362850OK Tutto bene

1 行的期望结果:

2021051211362850EPPDNY81 D91138414510 20210512 F OK Tutto bene

包含 LineResponse.class 列表的 Response.class

@Data
@NoArgsConstructor
@Group(minOccurs=0,maxOccurs= -1,type = Response.class)
public class Response {
    @Record(minOccurs=1,collection = List.class,name="responseLineList",type=LineResponse.class)
    List<LineResponse> responseLines;
}

在下面的类 LineResponse.class 中,它是一个带有接口的@Segment。

@Data
@NoArgsConstructor
@Record
public class LineResponse implements Serializable {
    
    @Field(ordinal = 1,required = true,length=16,format = "yyyyMMddhhmmssSS")
    Date elaboratedOn;

    @Segment(ordinal =2,name="requestLine",minOccurs = 1,maxOccurs = 1)
    RequestLine line;

    @Field(ordinal = 3,length=9)
    String errorCode;
    @Field(ordinal = 4,length=36)
    String errorMessage;
}

接口代码

public interface RequestLine {}

具体TestLine类的代码

@Data
@NoArgsConstructor
@Record
public class TestLine implements RequestLine {

    @Field(required = true,length=4,maxLength=4)
    private String recordtype; 
    @Field(required = true,length=1,maxLength=1)
    private String messageKO;
    @Field(required = true,maxLength=1)
    private String messageOK;
    @Field(required = true,maxLength=1)
    private String divisionCode;
    @Field(required = true,length=13,maxLength=13)
    private Integer progressive; 
    @Field(required = true,maxLength=1,defaultValue = "D")
    private String prefixItemCode;
    @Field(required = true,length=9,maxLength=9)
    private String itemCode; 
}

具体TestLineB类的代码

@Data
@NoArgsConstructor
@Record
public class TestLineB implements RequestLine {

    @Field(required = true,maxLength=9)
    private String itemCode;
    @Field(required = true,length=7,maxLength=7)
    private BigDecimal quantity;
    @Field(required = false,maxLength=1)
    private String cancellation;
    @Field(required = true,length=3,maxLength=3)
    private String productionLine;
}

这是我用StreamFactory测试的代码

// Filling mock Response with lines
LineResponse lineResponse = new LineResponse();
        lineResponse .setElaboratedOn(new Date());
        lineResponse .setLine(testLine);
        lineResponse .setErrorCode("OK");
        lineResponse .setErrorMessage("Tutto bene");

List<LineResponse> lineResponseList = new ArrayList<>();
        lineResponseList .add(lineResponse );
        
Response response = new Response();
response.setResponseLine(lineResponseList);

Writer writer = new StringWriter();

String writerName = "ResponseFile";
 // create a StreamFactory
            StreamFactory factory = StreamFactory.newInstance();
            factory.define(
                    new StreamBuilder(writerName)
                            .writeonly()
                            .format("fixedlength")
                            .parser(new FixedLengthParserBuilder())
                            .addGroup(Response.class)
            );

BeanWriter out = factory.createWriter(writerName,writer);
// JAVA to Writer
out.write(response);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)