5

2008 年のJIRA エントリで概説された Jettison の「機能」があり、次の問題に言及しています。

「要素」の値を「00102」にするとします。出力は次のようになります。

{ "Response": 
    { "element": "00102" }
}

しかし今、「要素」を「102」に設定しました。

{ "Response":
    { "element": 102 }
}

Jettison が助けになろうとしていることは理解していますが、真剣に、私に代わってこの種のことを決定する必要はありません。いいえ、結構です。

現在の回避策

現時点では、ここにあるユーザーによって概説されているソリューションを使用しました。このユーザーは、Bean 構成に次を追加します。

<bean id="simpleConverter" class="org.codehaus.jettison.mapped.SimpleConverter"/>

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
    <property name="typeConverter" ref="simpleConverter"/>
</bean>

これは、明らかに整数であっても、すべての要素が強制的に文字列であると言うほど、問題を部分的に解決します。これで、少なくとも、データが保持する構造が正確にわかり、要素の型が文字列から整数に変更されたり、知らないうちに元に戻ったりすることはありません。

問題

ただし、別の要素を整数として出力したい場合でも、現在は出力できません。要素ごとにではなく、要素の出力をサービス全体に強制することしかできないようです。

「Jackson を使用する」という提案 (フレームワークが Jettison を明示的に使用しているため、従うことはできません) 以外に、JSON 出力で文字列として強制したい要素を指定する方法はありますか?

4

1 に答える 1

1

SimpleConverterdouble と boolean も文字列に変換しますが、これは問題です。

「特別な」番号に対してのみ、デフォルトのコンバーターをオーバーライドできます。残念ながら、変換する元のフィールドのコンテキストを確認する方法はありません

public class MyConverter extends org.codehaus.jettison.mapped.DefaultConverter {

    public Object convertToJSONPrimitive(String text) {
        Object primitive = super.convertToJSONPrimitive(text);

        //Apply your conversion rule;
        if (primitive != null 
                && primitive instanceof Long 
                && text.startsWith("0"))
            return text;
        else 
            return primitive;
    }
}

ここで DefaultConverter の完全なコードを見ることができます

そして CXF 構成

<bean id="myConverter" class="MyConverter"/>

<bean id="jsonProvider" class="org.apache.cxf.jaxrs.provider.JSONProvider">
    <property name="typeConverter" ref="myConverter"/>
</bean>
于 2016-10-27T10:22:23.790 に答える