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

Avro 1.8.2 BigDecimal(逻辑类型)的Java代码生成

姬和豫
2023-03-14

如何在我的Apple类中生成BigDecimal?现在我只有一个字节缓冲符。。。。

使用Avro模式(avsc):

{"namespace": "com.example",
  "type": "record",
  "name": "Apple",
  "fields": [
    {"name": "price",  "type": {
                                          "type": "bytes",
                                          "logicalType": "decimal",
                                          "precision": 9,
                                          "scale": 2
                                        }}
  ]
}

使用IDL:

@namespace("com.example")
protocol AppleProtocol {
    record Apple {
        @java-class("java.math.BigDecimal") decimal(9,2) price;
    }
}

使用maven生成方法mvn clean compile和以下maven代码段:

           <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>1.8.2</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>schema</goal>
                            <goal>idl-protocol</goal>
                        </goals>
                        <configuration>
                            <sourceDirectory>${project.basedir}/src/main/avro</sourceDirectory>
                            <outputDirectory>${project.basedir}/src/main/java</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

这两种方法都返回了这个丑陋的方法,显然几乎无法使用。。。

public void setPrice(java.nio.ByteBuffer value) {
    this.price = value;
  }

如何使此方法请求BigDecimal?这是使用Avro

共有1个答案

龙新荣
2023-03-14

要使生成的类使用BigDecimal而不是ByteBuffer表示十进制逻辑类型,请将Avro Maven插件配置参数enableDecimalLogicalType设置为true。

<plugin>
    <groupId>org.apache.avro</groupId>
    <artifactId>avro-maven-plugin</artifactId>
    <version>1.8.2</version>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>schema</goal>
                <goal>idl-protocol</goal>
            </goals>
            <configuration>
                <enableDecimalLogicalType>true</enableDecimalLogicalType>
            </configuration>
        </execution>
    </executions>
</plugin>
 类似资料:
  • 2(名)-约翰 3(型号)-客车 4(attr_hash)-由java哈希代码计算

  • 使用Avro Java API,我可以创建一个简单的记录模式,如下所示: 如何使用逻辑类型标记架构字段,具体而言:https://avro.apache.org/docs/1.8.1/api/java/org/apache/avro/LogicalTypes.TimestampMillis.html

  • 问题内容: 问题是,由于某种原因。除了基本属性,设置器和获取器之外,xsd不能/不能定义所有逻辑变量,因此我们尝试通过xsd定义“注入代码”,而其他人实际上已经讨论了两次。我对带有“简单java方法”的“简单注入”没有任何问题,该类不需要在类def之上的任何“导入”语句。 但是如果我们想使用它的话。在我看来,除了setter或getters之外,我们无法获取或导入任何软件包。,请参阅下面的详细信息

  • 问题内容: 我碰到了Java行,并对它的输出感到困惑。您能否解释一下此代码背后的逻辑 输出: 问题答案: 好吧,它等效于: 真正地将原始内容显式转换为只是使其调用而不是。 我相信to 转换 实际上首先 要进行隐式加宽转换-就像这样: 这些帮助有用?

  • 问题内容: 最新的Avro编译器(1.8.2)使用基于Joda-Time的实现为日期逻辑类型生成Java源。如何配置Avro编译器以生成使用Java 8日期时间API的源? 问题答案: 目前(avro 1.8.2)这是不可能的。它被硬编码以生成Joda日期/时间类。 当前分支已切换到Java 8,并且存在一个未解决的问题(使用Pull Request )来添加生成具有类型的类的功能。 不幸的是,我

  • 问题内容: 为什么在下面的程序中不执行func3?在func1之后,不需要对func2进行评估,但是对于func3,不是吗? 问题答案: 您正在使用短路或。如果第一个参数为true,则整个表达式为true。 如果添加编译器使用的隐式括号可能会有所帮助 编辑 :正如Chris Jester-Young所说,这实际上是因为逻辑运算符必须从左到右的关联性: func1返回之后,它变为: 评估短路或后,它