1

my.company.bindy のようなパッケージにいくつかのクラスがあり、そのすべてに Bindy アノテーションが付けられるようにしたいと考えています。次に、CSV をこれらのタイプのいずれかにアンマーシャリングできる Camel ルートが必要です。すべてが機能していますが、パッケージ内に複数のバインディング アノテーション付きクラスがあると、アンマーシャリングが失敗します。これは、Bindy が CSV 行をパッケージ内のすべてのクラスに非整列化しようとしているためです。また、特定の行が複数のクラスに適切にマーシャリングされません。私のデータ形式は、Spring で次のように宣言されています。

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

4 に答える 4

4

この問題は Camel 2.16.0 で修正されました。

http://camel.apache.org/bindy.htmlから

「複数のモデルを使用する場合、予測できない結果を防ぐために、各モデルを独自のパッケージに配置する必要があります。

Camel 2.16 以降では、パッケージ名の代わりにクラス名を使用して bindy を構成するため、同じパッケージに複数のモデルを安全に含めることができるため、これは当てはまりません。"

于 2015-11-11T19:43:31.133 に答える
4

これに対する私の解決策は、次のように 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();
    }

}

}

これまでのところ、それは魅力のように機能します!

于 2013-05-06T23:24:55.193 に答える
0

Java DSL を使用して同じ種類の問題に遭遇しました。Bindy で注釈を付けた 2 つのクラスがあり、「間違った」クラスがインスタンス化されていました。

その場合の解決策は、バインド先のパッケージ名を完全に修飾することでした

例えば

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")
于 2014-11-12T20:40:12.473 に答える