Indriya库为ProductUnit设置别名后序列化不生效问题
为Indriya派生质量流量单位设置友好别名失效问题
任务
我想要给UOM的ProductUnit设置别名,让JSON/前端能显示友好的单位名称,目标单位是kg/h——这是由SI基本单位kg和s派生的质量流量单位。
使用SimpleUnitFormat的alias方法设置别名时无报错,但别名未生效,尽管方法注释明确说明该方法会“为单位添加全局别名”,我无法定位问题原因。方法签名如下:
public abstract void alias(Unit<?> unit, String alias);
问题重现
我预期将字符串“kg/h”解析为Indriya单位后,序列化时返回“kg/h”,但实际返回的是(kg/s)*3600。
单元测试代码
public class UnitsTest { private static final SimpleUnitFormat fs; private static final Unit<MassFlowRate> KILOGRAM_PER_HOUR; static { fs = SimpleUnitFormat.getInstance(); // KILOGRAM_PER_SECOND 定义在 si.uom.SI 中 KILOGRAM_PER_HOUR = KILOGRAM_PER_SECOND.multiply(3600); fs.alias(KILOGRAM_PER_SECOND.multiply(3600), "kg/h"); } @Test void testFlowRate() { String unitName = "kg/h"; Unit<? extends Quantity<?>> rate = fs.parse(unitName); Assertions.assertEquals(unitName, rate.toString()); //<-- 测试失败 Assertions.assertEquals(rate, KILOGRAM_PER_HOUR); } }
失败信息
org.opentest4j.AssertionFailedError: Expected :kg/h Actual :(kg/s)*3600
派生单位的字符串表示物理上是正确的,但不符合用户端的显示需求。
已尝试方案
- 替换
rate.toString()为rate.getName()或rate.getSymbol(),均返回null; - 使用
alternate()方法尝试设置别名:
KILOGRAM_PER_SECOND.multiply(3600).alternate("kg/h");
抛出异常:
java.lang.IllegalArgumentException: The parent unit: (kg/s)*3600 is not an unscaled SI unit at tech.units.indriya.unit.AlternateUnit.<init>(AlternateUnit.java:91) at tech.units.indriya.AbstractUnit.alternate(AbstractUnit.java:336)
- 尝试切换到
EBNFUnitFormat,但该格式不支持别名功能。
环境
问题在Windows和Linux环境下均能复现,使用Java 13,POM核心依赖如下:
<dependencies> <dependency> <groupId>tech.units</groupId> <artifactId>indriya</artifactId> <version>2.1.3</version> </dependency> <dependency> <groupId>si.uom</groupId> <artifactId>si-units</artifactId> <version>2.1</version> </dependency> </dependencies>
内容的提问来源于stack exchange,提问作者Johannes Jander
相关产品推荐
相关产品推荐

