首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Camel Bindy不恰当地转换BigDecimal

Camel Bindy不恰当地转换BigDecimal
EN

Stack Overflow用户
提问于 2014-11-09 13:37:11
回答 1查看 1K关注 0票数 0

下面是使用Camels的示例,但最终会引发断言错误,因为Bindy错误地转换了BigDecimal (用逗号代替点作为数字分隔符)。

这个代码有什么问题?

代码语言:javascript
复制
public class PurchaseOrderBindyTest extends TestCase {

    @Test
    public void testBindy() throws Exception {
        CamelContext context = new DefaultCamelContext();
        context.addRoutes(createRoute());
        context.start();

        MockEndpoint mock = context.getEndpoint("mock:result", MockEndpoint.class);
        mock.expectedBodiesReceived("Camel in Action,39.95,1\n");

        PurchaseOrder order = new PurchaseOrder();
        order.setAmount(1);
        order.setPrice(new BigDecimal("39.95"));
        order.setName("Camel in Action");

        ProducerTemplate template = context.createProducerTemplate();
        template.sendBody("direct:toCsv", order);

        mock.assertIsSatisfied();
    }

    public RouteBuilder createRoute() {
        return new RouteBuilder() {
            public void configure() throws Exception {
                from("direct:toCsv")
                        .marshal().bindy(BindyType.Csv, "camelinaction.bindy")
                        .to("mock:result");
            }
        };
    }
}

模型

代码语言:javascript
复制
@CsvRecord(separator = ",", crlf = "UNIX")
public class PurchaseOrder {

    @DataField(pos = 1)
    private String name;

    @DataField(pos = 2, precision = 2)
    private BigDecimal price;

    @DataField(pos = 3)
    private int amount;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }
}

断言错误

代码语言:javascript
复制
java.lang.AssertionError: mock://result Body of message: 0. Expected: <Camel in Action,39.95,1
> but was: <Camel in Action.39,95.1
>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-14 09:22:20

我的考试通过了,没有任何问题。有趣的是,在你的例子中“。和",“似乎是相反的。

Camel使用确定区域设置的java.text.DecimalFormat类如下所示:

代码语言:javascript
复制
Locale def = Locale.getDefault(Locale.Category.FORMAT);

您可以按以下方式重置区域设置默认值:

代码语言:javascript
复制
Locale.setDefault(new Locale ("en", "US"));

如果不想重置默认区域设置,可以将区域设置设置为:

代码语言:javascript
复制
BindyCsvDataFormat bindy = new BindyCsvDataFormat(PurchaseOrder.class);
bindy.setLocale(Locale.US.getCountry());

from("direct:toCsv")
    .marshal(bindy)
    ...

在这种情况下,Camel重置AbstractNumberFormat中的十进制格式符号如下:

代码语言:javascript
复制
if (locale != null) {
    this.format.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(locale));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26828777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档