Установка имени псевдонима для ProductUnit не возвращает этот псевдоним во время сериализации

Задача

Я пытаюсь установить псевдоним для UOMProductUnitчтобы единица отображалась в удобном для человека имени в JSON/моем интерфейсе. Рассматриваемая единица - «кг / ч», поэтому массовый расход получен из основных единиц СИ «кг» и «с».

Однако при установке псевдонима с помощью метода

      public abstract void alias(Unit<?> unit, String alias);

не возвращает ошибок, псевдоним игнорируется. Я не уверен, где я ошибаюсь, поскольку комментарии к кодуSimpleUnitFormatsay "Присоединяет общесистемный псевдоним к этому устройству".

Проблема

Я ожидаю, что смогу разобрать строку «кг/ч» в единицу Indrya и, если сериализовать эту единицу, вернуть «кг/ч». Вместо этого я получаю "(кг/с)*3600"

Код в виде юнит-теста:

      public class UnitsTest {
    private static final SimpleUnitFormat fs;
    private static final Unit<MassFlowRate> KILOGRAM_PER_HOUR;
    static {
        fs = SimpleUnitFormat.getInstance();
        // KILOGRAM_PER_SECOND is defined in 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()); //<-- fails
        Assertions.assertEquals(rate, KILOGRAM_PER_HOUR);
    }
}

ИassertEquals()терпит неудачу со следующим:

      org.opentest4j.AssertionFailedError: 
Expected :kg/h
Actual   :(kg/s)*3600

Как видите, строковое представление производной единицы ("(кг/с)*3600") физически корректно, но не то, что хотели бы видеть мои конечные пользователи.

Что я пробовал

Замена наrate.getName()тоже не работает, просто выдаёт. Заменаrate.toString()с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но это не позволяет использовать псевдонимы.

Я уверен, что неправильно понимаю всю библиотеку UoM/Indrya, но IDK как.

Среда

Проблема возникает как в 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>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.9.0</version>
        <scope>test</scope>
    </dependency>
    
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>
      

1 ответ

В конце концов, это было легко:

      fs.label(KILOGRAM_PER_HOUR, "kg/h");

Таким образом, устройство сериализуется вkg/hвtoString()

Другие вопросы по тегам