Как внедрить перечисления Jakarta в контексте приложения Spring? - PullRequest
2 голосов
/ 24 ноября 2008

У меня есть класс, конструктор которого принимает Джакартские перечисления . Я пытаюсь найти способ легко внедрить его с помощью Spring XML aplicationContext.

Например:

Перечисление:

public class MyEnum extends org.apache.commons.lang.enums.Enum {
    public static final MyEnum MY_FIRST_VALUE = new MyEnum("MyFirstValue");
    public static final MyEnum MY_SECOND_VALUE = new MyEnum("MySecondValue");

    public static MyEnum getEnum(String name) {
        return (MyEnum) getEnum(MyEnum.class, name);
    }
    [...other standard enum methods]
}

Класс, в который нужно ввести:

public class MyService {
    private final MyEnum status;
    public MyService(MyEnum status) {
        this.status = status;
    }
}

Контекст приложения:

<bean id="myService" class="MyService">
    <constructor-arg index="0" value="MyFirstValue" />
</bean>

Конечно, с этим у меня ошибка no matching editors or conversion strategy found. Есть ли простая интеграция между Spring и Jakarta enums? Или я должен написать свой собственный PropertyEditor?

Ответы [ 3 ]

3 голосов
/ 25 ноября 2008

Проверьте тег <util:constant> весной. Вам потребуется добавить схему в определение xml. Таким образом, вы получите следующее:

<bean id="myService" class="MyService">
  <constructor-arg index="0">
    <util:constant static-field="MyEnum.MY_FIRST_VALUE"/>
  </constructor-arg>
</bean>

Определение и использование тега (включая определение XSD) находится здесь .

1 голос
/ 24 ноября 2008

Я нашел решение, но оно очень многословно (слишком много, на мой вкус):

<bean id="myService" class="MyService">
    <constructor-arg index="0">
        <bean class="MyEnum" factory-method="getEnum">
            <constructor-arg value="MyFirstValue" />
        </bean>
    </constructor-arg>
</bean>
0 голосов
/ 19 августа 2011

Я проголосовал за ответ Спенсера, но обнаружил, что это тоже сработает. В этом примере вам просто нужно указать индекс , тип и name в конструкторе-аргументе.

<bean id="myService" class="MyService">
<constructor-arg index="0" type="com.package.MyEnum" value="MyFirstValue" />
</bean>

Я основал это на полученном сообщении об ошибке:

(подсказка: укажите аргументы index / type / name для простых параметров, чтобы избежать неоднозначности типов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...