当前位置: 首页 > 知识库问答 >
问题:

我可以在一个包中有多个绑定注释类,并且仍然在 Camel 中取消编组 CSV 吗?

薛泰
2023-03-14

我想要一个像我公司一样的套餐。bindy中的几个类都用bindy注释注释。然后,我希望有Camel路由可以将CSV解组为其中一种类型。我已经完成了所有工作,但如果包中有多个bindy注释类,则解组失败。这是因为Bindy试图将CSV行解组到包中的每个类中。并且一个特定的行不能正确地编组到多个类中。我的数据格式在Spring中声明如下:

<bean class="org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat">
    <property name="packages" value="my.company.bindy"/>
</bean>

共有3个答案

南门烈
2023-03-14

我使用JavaDSL遇到了同样的问题。我有两个用Bindy注释的类,“错误”的类正在被实例化。

在这种情况下,解决方案是完全限定我绑定到的包名称

例如

from("file:myfile.csv").
  unmarshall().
    bindy(BindyType.Csv, com.company.domain.OrderLine.class).
to("seda:output")

而不是

from("file:myfile.csv").
  unmarshall().
    bindy(BindyType.Csv, OrderLine.class).
to("seda:output")
匡玉堂
2023-03-14

我的解决方案是如下扩展BindyCsvDataFormat:

/**
* This class changes the behavior of BindyCsvDataFormat. Instead of detecting classes
* in package(s) which are annotated with bindy annotations, this class, specifically
* defines the class that will be unmarshalled into.
*/
public class SingleClassBindyCsvDataFormat extends BindyCsvDataFormat {

private Class<?> modelClass;

@Override
protected BindyAbstractFactory createModelFactory(PackageScanClassResolver resolver) throws Exception {
    return new OneClassBindyCsvFactory(resolver, getModelClass());
}

@Override
public void setPackages(String... packages) {
    throw new UnsupportedOperationException("This dataformat does not support package based model searches.");
}

public Class<?> getModelClass() {
    return modelClass;
}

public void setModelClass(Class<?> modelClass) {
    this.modelClass = modelClass;
}

private static class OneClassBindyCsvFactory extends BindyCsvFactory {

    public OneClassBindyCsvFactory(PackageScanClassResolver resolver, Class<?> modelClass) throws Exception {
        super(resolver, new String[]{});
        Preconditions.checkNotNull(modelClass);
        models = ImmutableSet.<Class<?>>of(modelClass);
        initCsvModel();
    }

}

}

到目前为止,它就像一个魅力!

淳于健
2023-03-14

此问题已在 Camel 2.16.0 中修复。

从http://camel.apache.org/bindy.html

“如果你使用多个模型,每个模型都必须放在它自己的包中,以防止不可预测的结果。

从Camel 2.16开始,情况不再如此,因为您可以在同一个包中安全地拥有多个模型,因为您现在使用类名而不是包名来配置bindy。”

 类似资料:
  • 如果不是这样,请给我一个简单的例子。

  • 大多数或所有核心hibernate配置属性都可以在启动属性文件中指定,以替代在hibernate.cfg.xml中指定映射。

  • 是否允许在一个方法中使用多个@scheduled注释?

  • 我有多个方法,我希望有静态锁定,以便没有两个对象可以访问一个方法,但同时不同的方法不会被这些对象锁定,并且可以独立运行。 现在我希望这两个方法在被锁定时相互独立,但同时我希望同一个类的多个实例被锁定在一个方法上。 如何实现这一点?通过使用不同的类。仅仅这样做能达到目的吗?

  • 关于这个主题有几个问题,但我找不到一个与Groovy“AST”注释有关的问题。从表面上看,这不仅方便,而且根据日志级别给你有条件的执行。 在我的书Groovy in Action中,它说: 将Slf4j记录器作为静态最终组织注入。slf4j。将日志记录到类中,并使用org对其进行初始化。slf4j。伐木厂。getLogger(类)。LogBack框架使用SLF4J作为底层记录器,因此LogBack

  • 关于这个主题有几个问题,但我找不到一个与Groovy“ast”注释有关的问题。从表面上看,这不仅方便,而且可以根据日志级别有条件地执行内容。 在我的书《Groovy In Action》中,它说: 将Slf4j记录器作为静态最终org.Slf4j.logger注入到类中,并使用org.Slf4j.loggerFactory.getLogger(类)初始化它。LogBack框架使用SLF4J作为底层