Spring MVC: привязка из формы: опция enum - PullRequest
1 голос
/ 11 января 2012

Я ищу привязку из моего поля выбора в моей форме к определенному перечислению.

Рассмотрим это перечисление:

public enum OperatorDTO {
LESS_THAN ("<"),
GREATER_THAN (">"),
EQUALS ("="),
NOT_EQUALS("!=");

private String operator;

public String getOperator() {
    return operator;
}

private OperatorDTO(String operator)
{
    this.operator = operator;
}

и этот фрагмент из моей формы:

<form:select path="rules[${counter.index}].operator">
    <form:options itemLabel="operator" itemValue="operator" />
</form:select>

Страница отображается хорошо и отображает различные символы ">", "<" в раскрывающемся списке </p>

Однако, когда я отправляю свою форму, я получаю ошибки, когда она пытается привязать значения обратно к перечислениям например "Нет enum const class com.fmrco.insight.adminconsole.dto.enums.OperatorDTO. <" </p>

Есть ли простой способ выполнить эту привязку?

Спасибо

Ответы [ 2 ]

6 голосов
/ 11 января 2012

Попробуйте опустить itemValue="operator".

Значение элемента должно быть именем константы перечисления, и, насколько я помню, это поведение по умолчанию.

1 голос
/ 18 декабря 2013

Фрагмент тега формы верен, и перечисление также корректно. Чего здесь не хватает, так это конвертера, который Spring будет использовать для преобразования строки из form:options элемента в OperatorDTO enum.

1) Добавьте еще два метода в OperatorDTO enum

    // Enum level method to get enum instance by operator field.
    public static OperatorDTO getByOperator( final String p_operator ) {
        for ( OperatorDTO operatorDTO : OperatorDTO.values() ) {
            if ( operatorDTO.isOperatorEqual( p_operator ) ) {
                return operatorDTO;
            }
        }
        return null;
    }
    // Instance level method to compare operator field.
    public boolean isOperatorEqual( final String p_operator ) {
        return getOperator().equals( p_operator ) ? true : false;
    }

2) Создать специальный конвертер, такой как

import org.springframework.core.convert.converter.Converter;

public class OperatorDTOConverter implements Converter<String, OperatorDTO> {
    public OperatorDTO convert( String source ) {
        return OperatorDTO.getByOperator( source.trim() );
    }
}

3) Преобразователь Registeg в конфигурации приложения ( конфигурация java в данном случае)

@Configuration
@EnableWebMvc
@ComponentScan( basePackages = { "your.base.package"} )
public class AppWebConfig extends WebMvcConfigurerAdapter {
@Override
    public void addFormatters( FormatterRegistry registry ) {
        registry.addConverter( String.class, OperatorDTO.class, new OperatorDTOConverter() );
    }

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