1

Web リクエスト中にオブジェクトを適切なオブジェクトに変換@InitBinderできるように、注釈をテストしています。StringEnum

次の単純なものを作成しましたEnum

SampleEnum.java

public enum SampleEnum {
    ONE,
    TWO,
    THREE,
    FOUR,
    FIVE;
}

次に、コードPropertyEditorSupportから呼び出されるように拡張するエディターを作成しました。@InitBinder

EnumPropertyEditor.java

@SuppressWarnings("rawtypes")
public class EnumPropertyEditor extends PropertyEditorSupport {
    private Class clazz;

    public EnumPropertyEditor(Class clazz) {
        this.clazz = clazz;
    }

    @Override
    public String getAsText() {
        return (getValue() == null ? "" : ((Enum) getValue()).name());
    }

    @SuppressWarnings("unchecked")
    @Override
    public void setAsText(String text) {
        Enum e = Enum.valueOf(clazz, text);
        setValue(e);
    }
}

次に、コントローラーに@InitBinderと単純なリクエスト マッピングを追加しました。

コントローラ

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(SampleEnum.class, new EnumPropertyEditor(SampleEnum.class));
}

@RequestMapping(method = POST, value = "/postSampleEnum")
@ResponseBody
public SampleEnum postSampleEnum(@RequestBody SampleEnum sampleEnum) {
    return sampleEnum;  
}

SampleEnum私の理解では、このコントローラ メソッドのリクエストでは、文字列値をオブジェクトに変換しようとする必要があります。ただし、initBinder、リクエスト マッピング メソッド、またはEnumPropertyEditor.

私は FireFox で RESTClient を使用してテストしており、リクエスト本文「THREE」を送信しようとしましたが、これは機能すると予想されます。代わりに、リクエスト本文の内容に関係なく、415 エラーが発生します。(リクエスト エンティティが、リクエストされたメソッドのリクエストされたリソースでサポートされていない形式であるため、サーバーはこのリクエストを拒否しました ()。)

の代わりに文字列を受け取るようにリクエスト マッピングを変更するSampleEnumと、postSampleEnumが呼び出され、カスタム エディターは使用されません (予想どおり)。

カスタム エディター コードを呼び出せるようにするものが不足していますか? これをデバッグし続ける最善の方法は何ですか?

4

1 に答える 1

0

まず、RESTClient のリクエスト ヘッダーに application/json コンテンツ タイプを追加するのを忘れていました。>_<

おっと

ただし、コードの実行がまだカスタム プロパティ エディターを経由していないことに気付きました。GriffeyDog が言ったように、RequestParamまたはに切り替えた場合にのみコードが実行されるようModelAttributeです。

于 2013-05-29T12:53:05.353 に答える