3


私は次の列挙型を持っています:

public enum SearchLocationTypes {REGISTRATION, WORKPLACE}

この列挙型+フォーマッターアノテーションファクトリ用のコンバーターとフォーマッターの両方を作成しました(念のため)。

フォーマッター:

public class SearchLocationTypesFormatter implements Formatter<SearchLocationTypes> {
    @Override
    public String print(SearchLocationTypes type, Locale locale) {
        String strType = "";
        switch(type) {
            case REGISTRATION: 
                strType = "rg";
                break;
            case WORKPLACE:
                strType = "wp";
                break;
        }
        return strType;
    }

    @Override
    public SearchLocationTypes parse(String strType, Locale locale) throws ParseException {
        if(strType.equals("rg")) return SearchLocationTypes.REGISTRATION;
        if(strType.equals("wp")) return SearchLocationTypes.WORKPLACE;
        else throw new IllegalArgumentException();
    }
}

工場:

public class SearchLocationTypesAnnotationFormatterFactory 
implements AnnotationFormatterFactory<SearchLocationTypesFormat> {

    @Override
    public Set<Class<?>> getFieldTypes() {
        return new HashSet<Class<?>>(Arrays.asList(new Class<?>[] {SearchLocationTypes.class}));
    }

    @Override
    public Printer<?> getPrinter(SearchLocationTypesFormat a, Class<?> type) {
        return new SearchLocationTypesFormatter();
    }

    @Override
    public Parser<?> getParser(SearchLocationTypesFormat a, Class<?> type) {
        return new SearchLocationTypesFormatter();
    }

}

注釈:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface SearchLocationTypesFormat {}

コンバータ:

public class SearchLocationTypesConverter implements Converter<SearchLocationTypes, String> {

    @Override
    public String convert(SearchLocationTypes type) {
        String strType = "";
        switch(type) {
            case REGISTRATION: 
                strType = "rg";
                break;
            case WORKPLACE:
                strType = "wp";
                break;
        }
        return strType;
    }

}

servlet.xmlの一部:

<mvc:annotation-driven conversion-service="conversionService"  />
<bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="ru.riado.web.format.SearchLocationTypesConverter" />
        </set>
    </property>
    <property name="formatters">
        <set>
            <bean class="ru.riado.web.format.SearchLocationTypesAnnotationFormatterFactory" />
            <bean class="ru.riado.web.format.SearchSortTypesFormatter" />
        </set>
    </property>
</bean>

JSPから次のコードを呼び出すと、すべてが期待どおりに機能します。
例:「REGISTRATION」に設定されたプロパティ「locType」を持つBean「form」があるとします。

public class Form {
  @SearchLocationTypesFormat
  private SearchLocationTypes locType;
  // setters and getters
}

今、私は次のコードを使用しており、その出力は「rg」です。

<s:eval expression="form.locType">

しかし、春の形はその値を「rg」に変換しません。これの代わりに、デフォルトのコンバーターを使用しているかのように、値を「REGISTRATION」に設定します。デフォルトの変換をオフにしようとしましたが、それは役に立ちませんでした。

誰かが私がここで欠けているものを教えてもらえますか?

4

1 に答える 1

0

最初にコードをリファクタリングします。

public enum SearchLocationTypes {
  REGISTRATION("rg"),
  WORKPLACE("wp");

  private String abbr;

  SearchLocationTypes(String abbr) {
    this.abbr = abbr;
  }

  @Override
  public String toString() {
    return abbr;
  }

  public static SearchLocationTypes fromString(String from) {
    for (SearchLocationTypes locType : SearchLocationTypes.values()) {
      if (locType.abbr.equals(from)) {
        return locType;
      }
    }
    throw new IllegalArgumentException();
  }
}

およびFormatter(およびConverterprint メソッドと同じ):

public class SearchLocationTypesFormatter implements
    Formatter<SearchLocationTypes> {
  @Override
  public String print(SearchLocationTypes type, Locale locale) {
    return type == null ? "" : type.toString();
  }

  @Override
  public SearchLocationTypes parse(String strType, Locale locale)
      throws ParseException {
    return SearchLocationTypes.fromString(strType);
  }
}

form:radiobuttonsこれで、 orを使用して jsp で使用できますform:options

<form:select path="locType">
  <form:options />
</form:select>

デフォルトでは、フォーム値は列挙型の name() であり、フォーム ラベルは列挙型の toString()です( https://jira.springsource.org/browse/SPR-3389から)。

これは確認できませんが、試し<s:eval expression="form.locType">てみてください。

于 2012-08-03T13:02:33.013 に答える