我目前正试图从camel-bindy-2.12.1升级到camel-bindy-2.16.2,但在尝试将由多个类组成的模型应用到数据集时遇到了一个问题,导致了一个文本文件。
我在一个包(com.sample.package)中有许多类,我可以使用以下代码(Camel Spring DSL)进行封送处理:
<bean id="bindyFixedLengthDataformat" class="org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat">
<constructor-arg value="com.sample.package" />
</bean>
<marshal ref="bindyFixedLengthDataformat" />
这个bean调用将把包中的所有类应用于被封送的数据,从而生成一个文件。
它在camel-bindy-2.12.1中工作得很好,但是上面的构造函数在camel-bindy-2.16.2中不再可用。
我一直找不到任何例子,可以实现相同的功能与删除的构造函数。
谢谢。
这是一个老帖子,但我确实想出了解决办法。这个想法是,您必须为每个类创建一个单独的bindy格式化程序...然后将每个格式化程序应用到camel消息的正文:
/* BEGIN Spring Boot Bean Config */
import org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat;
@Autowired
CamelContext camelContext;
@Bean (name="bindyFixedLengthDataformat_Part1")
public BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part1 () {
BindyFixedLengthDataFormat bindy = new BindyFixedLengthDataFormat (com.xyz.Part1.class);
bindy.setCamelContext(camelContext);
return bindy;
}
@Bean (name="bindyFixedLengthDataformat_Part2")
public BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part2 () {
BindyFixedLengthDataFormat bindy = new BindyFixedLengthDataFormat (com.xyz.Part2.class);
bindy.setCamelContext(camelContext);
return bindy;
}
...
@Bean (name="bindyFixedLengthDataformat_PartN")
public BindyFixedLengthDataFormat bindyFixedLengthDataformat_PartN () {
BindyFixedLengthDataFormat bindy = new BindyFixedLengthDataFormat (com.xyz.PartN.class);
bindy.setCamelContext(camelContext);
return bindy;
}
@Bean (name="bindyConverter")
BindyConverterUtil bindyConverter () {
BindyConverterUtil bindyConverter = new BindyConverterUtil () ; //This is a custom bean containing all the converters you need. Implements method process (Exchange)
bindyConverter.setBindyFixedLengthDataformat_Part1(bindyFixedLengthDataformat_Part1());
bindyConverter.setBindyFixedLengthDataformat_Part2(bindyFixedLengthDataformat_Part2());
...
bindyConverter.setBindyFixedLengthDataformat_Part5(bindyFixedLengthDataformat_PartN());
return bindyConverter;
}
@Bean (name="createObjectArrayListWithDataClasses")
public ListWithDifferentDataClasses createObjectArrayListWithDataClasses () {
ListWithDifferentDataClasses lineValues = new ListWithDifferentDataClasses(); // This is a custom bean that basically creates an array list of classes containing the data you want to marshal
// Implements method process(Exchange).
// Adds classes using: exchange.getIn().setBody(<ArrayList of classes>);
return lineValues;
}
/* END Spring Boot Bean Config */
/* Bindy Converter Util */
package com.xyz;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat;
public class BindyConverterUtil implements Processor {
/* (non-Javadoc)
* @see org.apache.camel.Processor#process(org.apache.camel.Exchange)
*/
private BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part1;
private BindyFixedLengthDataFormat bindyFixedLengthDataformat_Part2;
private BindyFixedLengthDataFormat bindyFixedLengthDataformat_PartN;
public void setBindyFixedLengthDataformat_Part1 (BindyFixedLengthDataFormat bindyFormatter) {
this.bindyFixedLengthDataformat_Part1 = bindyFormatter;
}
public void setBindyFixedLengthDataformat_Part2 (BindyFixedLengthDataFormat bindyFormatter) {
this.bindyFixedLengthDataformat_Part2 = bindyFormatter;
}
public void setBindyFixedLengthDataformat_PartN (BindyFixedLengthDataFormat bindyFormatter) {
this.bindyFixedLengthDataformat_PartN = bindyFormatter;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void process(Exchange exchange) throws Exception {
// TODO Auto-generated method stub
ArrayList <HashMap> contents = (ArrayList <HashMap>) exchange.getIn().getBody(); //From the createObjectArrayListWithDataClasses bean.
OutputStream outputStream = new ByteArrayOutputStream();
for (HashMap item: contents) {
if ( null != item.get(Part1.class.getName()) ) {
bindyFixedLengthDataformat_Part1.marshal(exchange, item.get(Part1.class.getName()), outputStream);
}
else if ( null != item.get(Part2.class.getName()) ) {
bindyFixedLengthDataformat_Part2.marshal(exchange, item.get(Part2.class.getName()), outputStream);
}
...
else if ( null != item.get(PartN.class.getName()) ) {
bindyFixedLengthDataformat_PartN.marshal(exchange, item.get(PartN.class.getName()), outputStream);
}
else {
throw new Exception ("Bindy Converter - Cannot marshal record. Format is not recognized. ");
}
}
exchange.getIn().setBody(outputStream);
}
}
/* End Bindy Converter Util */
/* Camel Route (XML) */
<route id="xyxz" >
<from uri="timer...or whatever" />
<to uri="createObjectArrayListWithDataClasses" />
<to uri="bindyConverter" />
<to uri="file://somepath/?fileName=outputfileName_${date:now:yyyyMMddhhmmss}.txt" />
</route>
/* End Camel Route (XML) */
问题内容: 我试图编组多个对象,例如添加到via中。我开始使用此设置: 和 但是,我得到了以下运行时例外: javax.xml.bind.JAXBException:com.jaxb.example.marshall.Book或其任何超类对此上下文都是未知的] 我的类型定义如下。 书:- 图书清单:- 马歇尔代码:- 我正在尝试放置注释(参考:-JAXB异常:该上下文未知的类)。该注释在我的版本中
我有一个带有绑定的REST-dsl骆驼路由:json_xml with.type()和outType()。当没有异常发生时,它工作得很好。也就是说,json输入给出了json输出。Xml输入给出Xml输出。
我是Apache Camel和Java DSL的新手。我想通过使用图像处理工具将一个图像文件分割到不同的endpoint。什么是所有的组件我需要使用来实现这一点,我还需要发送分割图像到一个更多的endpoint。
我有一个遗留web服务项目,它接收两个不同的XML模式,但属性名称相同(包括根元素)。我正在使用Spring、OXM和JAXB2进行编组/解组。 我已经用另一个问题解决了前面的一个问题,所以我使用SAX解析器来确定使用哪一个解组器。解析XML时,我检查一个值,然后就可以使用反编组器或其他反编组器。 我如何将其转换为更Spring(OXM)的方法呢?
问题内容: 我想向不同的收件人发送数千封不同的电子邮件,并想打开与我的SMTP的连接并保留它。我希望这样可以更快,然后重新打开错误邮件的连接。我想为此使用Apache Commons Email,但如有必要,可以使用Java Mail API。 现在,我正在执行此操作,每次打开一个都会关闭连接: 问题答案: 这是我的性能测试课程。使用一个连接发送邮件的速度快4倍,然后每次都重新打开连接(使用普通邮
我尝试使用Apache Camel(版本2.25.3)反应流和Spring Boot来读取一个大型csv文件,并使用Bindy解封这些行。这是“工作”,因为应用程序运行并检测文件,但我只看到流中文件的第一行。它似乎与Bindy相关,因为如果我从等式中去掉解组,我就可以在流中返回csv文件的所有行。我已经简化了这个问题,在这里演示了SO。我正在使用Spring Webflux来公开结果发布者。 所以