1

JSON を使用して、Ext JS 4 から Spring 3 コントローラーにフォームを送信しようとしています。Spring のビルトイン Jackson JSON サポートを使用したシリアライゼーション/デシリアライゼーションに Jackson 1.9.8 を使用しています。

新しいレコードの Domain オブジェクトに、最初は null の status フィールドがあります。フォームが送信されると、次の json が生成されます (いくつかのフィールドに縮小されています)

{"id":0,"name":"someName","status":""}

送信後、サーバーログに次のように表示されます

"nested exception is org.codehaus.jackson.map.JsonMappingException: Can not construct instance of com.blah.domain.StatusEnum from String value '': value not one of the declared Enum instance names"

したがって、ジャクソンは有効な Enum 値を期待しているか、空の文字列を含む値をまったく期待していないようです。Ext JS、Jackson、Spring のいずれであっても、これを修正するにはどうすればよいですか?

次のような独自の ObjectMapper を作成しようとしました

public class MyObjectMapper extends Object Mapper {
    public MyObjectMapper() {
        configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
    }
}

これをプロパティとして MappingJacksonMappingView に送信しますが、これは機能しませんでした。MappingJacksonHttpMessageConverter にも送信しようとしましたが、うまくいきませんでした。副次的な質問: 自分の ObjectMapper で送信する必要があるのはどれですか?

提案?

4

4 に答える 4

2

他にできることはorg.codehaus.jackson.map.JsonDeserializer、特定の列挙型に特化したデシリアライザー (extends ) を作成することです。これには、一致しないもののデフォルト値があります。私が行ったことは、逆シリアル化するクラスを取る列挙型の抽象デシリアライザーを作成することであり、問​​題が発生したときにこのプロセスを高速化します。

public abstract class EnumDeserializer<T extends Enum<T>> extends JsonDeserializer<T> {
    private Class<T> enumClass;

    public EnumDeserializer(final Class<T> iEnumClass) {
        super();
        enumClass = iEnumClass;
    }

    @Override
    public T deserialize(final JsonParser jp,
                         final DeserializationContext ctxt) throws IOException, JsonProcessingException {
        final String value = jp.getText();
        for (final T enumValue : enumClass.getEnumConstants()) {
            if (enumValue.name().equals(value)) {
                return enumValue;
            }
        }
        return null;
    }
}

これがジェネリック クラスです。基本的には列挙型クラスを取得し、列挙型の値を反復処理して、次のトークンをチェックして任意の名前と一致するようにします。そうでない場合は null を返します。

次に、列挙 MyEnum がある場合、次のEnumDeserializerようなサブクラスを作成します。

public class MyEnumDeserializer extends EnumDeserializer<MyEnum> {
    public MyEnumDeserializer() {
        super(MyEnum.class);
    }
}

次に、宣言する場所MyEnum

@JsonDeserialize(using = MyEnumDeserializer.class)
public enum MyEnum {
    ...
}
于 2014-09-26T18:23:27.737 に答える
1

同じ問題があります。空の文字列を含むJSONストリームを読んでいます。JSONストリームは外部サービスからのものであるため、私はJSONストリームを制御していません。そして、私はいつも同じエラーメッセージを受け取ります。私はここでこれを試しました:

mapper.getDeserializationConfig().with(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

しかし、効果はありません。バグのように見えます。

于 2012-10-17T08:01:22.007 に答える
1

私はSpringに慣れていませんが、念のため、クライアント側で処理する方が簡単かもしれません:

Ext.define('My.form.Field', {
    extend: 'Ext.form.field.Text',

    getSubmitValue: function() {
        var me = this,
            value;

        value = me.getRawValue();

        if ( value === '' ) {
            return ...;
        }
    }
});

allowBlankプロパティを に設定して、空のフィールドの送信を禁止することもできますfalse

于 2012-08-15T16:03:52.473 に答える
1

EXT JS モデルにデフォルトを追加して、常に値が存在するようにしました。私はこれをする必要がなかったことを望んでいましたが、それほど大したことではありません.

于 2012-08-28T13:48:51.923 に答える