У меня постоянный класс

@Component
public class NameConstants implements Serializable{
    public final static String NAME = "randomName";
    public static String getNAME() {
        return NAME;
    }   
}

И следующий веб-поток, похоже, не работает для меня:

<subflow-state id="#{NameConstants.NAME }" subflow="someflow">

Можно ли использовать выражение EL внутри поля ID? Я продолжаю получать ошибку:

'#{NameConstants.NAME }'is not a valid value for 'NCName'.
0
Ryan Fung 27 Фев 2015 в 06:13

2 ответа

Почему вы будете использовать константу в качестве идентификатора для состояния подпотока? Я предполагаю, что нет смысла использовать внешний объект для установки идентификатора в поле идентификатора состояния потока.

Вы можете попробовать это

<subflow-state id="#{T(com.foo.NameConstants).NAME}" subflow="someflow">
<!-- NameConstants#getNAME should be called -->

Я не тестировал это решение.

Почему NameConstants аннотируется с @Component? Я думаю, что это также должно работать с простым Pojo или Enum. Я никогда не пытался использовать EL в поле id состояния потока.

Мы используем выражения EL следующим образом:

<subflow-state id="choose-address-subflow" subflow="address">
    <input name="addressTypeId" value="T(org.our.company.domain.Address$Type).DELIVERY.getId()" type="java.lang.Integer"/>
    ...
</subflow-state>

Где org.shop.domain.Address$Type — это вложенное перечисление в модели домена org.shop.domain.Address, которое можно увидеть на $ между Address и Type.

Другой пример — сохранение значения в области потока и доступ к нему в состоянии принятия решения.

<view-state id="summary" view="some-view">
    <on-entry>
       <!-- value can also be defined in some external objects like Address$Type-->
       <set name="flowScope.nextState" value="'is-submitted'" type="java.lang.String"/> 
    </on-entry>
    ...
</view-state>

В состоянии принятия решения

<decision-state id="is-check-successful">
    <if test="action.isCheckSuccessful(flowRequestContext)"
        <!-- if check returns true, next state is is-submitted -->
        then="#{flowScope.nextState}" 
        else="first-state"/>
</decision-state>
1
Thomas Haarbach 15 Мар 2015 в 22:23

Да, вы можете сделать это так

#{T(com.foo.NameConstants).NAME}
-1
fujy 1 Мар 2015 в 00:05
Для чего Т? Кастинг?
 – 
Ryan Fung
2 Мар 2015 в 04:19
T предназначен для универсального типа T, если вам нужна дополнительная информация об этом, обратитесь к справочнику по языку выражений Spring по типам docs.spring.io/spring/docs/current/spring-framework-reference/…
 – 
fujy
2 Мар 2015 в 20:31
Убедитесь, что вы указываете полное имя пакета вашего класса
 – 
fujy
3 Мар 2015 в 06:50
Есть еще одно решение, но оно такое же чистое, как и это: вы можете поместить свое статическое значение в любую область переменных, к которой имеет доступ веб-поток; convertScope, flowScope, ... и т. д. при необходимости проверьте здесь больше docs.spring.io/spring-webflow/docs/current-SNAPSHOT/reference/…
 – 
fujy
3 Мар 2015 в 07:07