java.lang.IllegalArgumentException : Some fields are missing (optional or mandatory) 异常

标签 java apache-camel bindy

我正在尝试使用 Apache Camel Bindy 创建一个固定文件阅读器,但出现异常。请帮助我找到解决方案。没有页眉和页脚,效果很好。

更新: 文件小到现在无法理解,并添加了 public

文件内容:

101-08-2009
30A9
20A9
60A9
40A9
10A9
50A8
9000000002

新异常:

java.lang.IllegalArgumentException: Some fields are missing (optional or mandatory), line: 2
    at org.apache.camel.dataformat.bindy.BindyFixedLengthFactory.bind(BindyFixedLengthFactory.java:295) ~[camel-bindy-2.19.1.jar:2.19.1]
    at org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat.createModel(BindyFixedLengthDataFormat.java:294) ~[camel-bindy-2.19.1.jar:2.19.1]

异常:

org.apache.camel.RuntimeCamelException: java.lang.IllegalAccessException: Class org.apache.camel.util.ObjectHelper can not access a member of class com.camel.examples.OrderHeader with modifiers ""
    at org.apache.camel.util.ObjectHelper.newInstance(ObjectHelper.java:1686) ~[camel-core-2.19.1.jar:2.19.1]

路由器:

// @Override
    public void configure() throws Exception {
        Comparator<Order> comparator = new Comparator<Order>() {
            @Override
            public int compare(Order o1, Order o2) {
                return o1.getOrderNr() - o2.getOrderNr();
            }
        };

       DataFormat bindy = new BindyFixedLengthDataFormat(Order.class);
        from("file:C:/Users/workspace/SampleProjects/in?delete=true")
                .routeId("ValidateFile-Post2Q")

                .unmarshal(bindy).split(body().sort(comparator));

模型 Java 类:

    @FixedLengthRecord(length = 4, paddingChar = ' ', header = OrderHeader.class, footer = OrderFooter.class)
public class Order {

    private @Link OrderHeader header;
    private @Link OrderFooter footer;

    @DataField(pos = 1, length = 2)
    private int orderNr;

    @DataField(pos = 3, length = 2)
    private String clientNr;


    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return orderNr + clientNr + header + footer;
    }

    public OrderHeader getHeader() {
        return header;
    }


    public void setHeader(OrderHeader header) {
        this.header = header;
    }


    public OrderFooter getFooter() {
        return footer;
    }


    public void setFooter(OrderFooter footer) {
        this.footer = footer;
    }

    public int getOrderNr() {
        return orderNr;
    }

    public void setOrderNr(int orderNr) {
        this.orderNr = orderNr;
    }

    public String getClientNr() {
        return clientNr;
    }

    public void setClientNr(String clientNr) {
        this.clientNr = clientNr;
    }
}

    @FixedLengthRecord
    public class OrderFooter {

        @DataField(pos = 1, length = 1)
        public int recordType ;

        @DataField(pos = 2, length = 9)
        public String numberOfRecordsInTheFile;

        public String toString() {
            return recordType + ":" + numberOfRecordsInTheFile;
        }

        public int getRecordType() {
            return recordType;
        }

        public void setRecordType(int recordType) {
            this.recordType = recordType;
        }

        public String getNumberOfRecordsInTheFile() {
            return numberOfRecordsInTheFile;
        }

        public void setNumberOfRecordsInTheFile(String numberOfRecordsInTheFile) {
            this.numberOfRecordsInTheFile = numberOfRecordsInTheFile;
        }   
    }

    @FixedLengthRecord
    public class OrderHeader {
        @DataField(pos = 1, length = 1)
        public int recordType = 1;

        @DataField(pos = 2, length = 10, pattern = "dd-MM-yyyy")
        public Date recordDate;

        public String toString() {
            return recordType + ":" + new SimpleDateFormat("dd-MM-yyyy").format(recordDate);
        }

        public int getRecordType() {
            return recordType;
        }

        public void setRecordType(int recordType) {
            this.recordType = recordType;
        }

        public Date getRecordDate() {
            return recordDate;
        }

        public void setRecordDate(Date recordDate) {
            this.recordDate = recordDate;
        }
    }

依赖关系:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.8.RELEASE</version>
    </parent>

    <dependencies>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-spring-boot-starter</artifactId>
            <version>2.19.1</version>
        </dependency>

        <!-- Camel xquery support -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-saxon</artifactId>
            <version>2.19.1</version>
        </dependency>

        <!-- Camel JMS support and ActiveMq -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jms</artifactId>
            <version>2.19.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-camel</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.activemq</groupId>
                    <artifactId>activemq-broker</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-ftp</artifactId>
            <version>2.19.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-bindy</artifactId>
            <version>2.19.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-stream</artifactId>
            <version>2.19.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-restlet</artifactId>
            <version>2.19.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-flatpack</artifactId>
            <version>2.19.1</version>
        </dependency>
        <!-- Hawtio dependency - a lightweight web console to monitor and manage 
            application -->
        <dependency>
            <groupId>io.hawt</groupId>
            <artifactId>hawtio-springboot</artifactId>
            <version>1.5.2</version>
        </dependency>
        <dependency>
            <groupId>io.hawt</groupId>
            <artifactId>hawtio-core</artifactId>
            <version>1.5.2</version>
        </dependency>



    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

最佳答案

我快速浏览了 camel bindy 组件测试,但找不到将 @FixedLengthRecord(header,footer) 与 @Link 组合在一起的测试

您的问题的一种可能的解决方法是

  1. 从订单中的页眉和页脚字段中删除@Link,例如

    
    
     @FixedLengthRecord(length = 4, paddingChar = ' ', header = OrderHeader.class, footer = OrderFooter.class)
        public class Order {
    
    <pre><code>    private OrderHeader header;
        private  OrderFooter footer;
    } 
    </code></pre>
    
    

    2.然后页眉和页脚被 bindy 成功处理并添加到交换中作为标题(“CamelBindyFixedLengthHeader”,“CamelBindyFixedLengthFooter”)因此使用处理器您可以将它们设置为订单页眉,之后的页脚字段 例如

    .unmarshal(bindy).split(body()).process(exchange -> { 
    Order order = exchange.getIn().getBody(Order.class);<br/>
                     order.setFooter((OrderFooter)exchange.getIn().getHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_FOOTER,Map.class).get(OrderFooter.class.getName())); 
                       order.setHeader((OrderHeader)exchange.getIn().getHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER,Map.class).get(OrderHeader.class.getName()));
                });
    

相关camel单元测试here

关于java.lang.IllegalArgumentException : Some fields are missing (optional or mandatory) 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47071656/

相关文章:

java数组的arraylists

java 进程在启动使用该文件系统的可执行文件时挂起

apache-camel - 整数属性验证错误( Camel )

java - 如何使用 apache Camel 而不是 xml 记录列表将平面文件中的单个记录转换为一个 xml

java - 扩展 ascii 代码中的 Camel Bindy 分隔符

java - 当某些列有引号而有些没有时,如何使用 Camel 绑定(bind)解析 csv 文件?

java - 使用自定义时间获取当前日期

java - 简单的 Java 命令不在 Cron 中运行

apache-camel - 无法从 SQS Camel Route 中删除消息

java - 使用 Camel 和 Java 发送电子邮件。 ISSUE STARTTLS 错误