1

SpringMVCメソッドのJSON応答を生成するためにカスタムJsonSerializerを使用しています。応答のフィールドの1つは列挙型です。列挙型の一部のプロパティも返すため、toString()の値を返すのではなく、その値のローカライズされた説明を返したいと思います。これは列挙型コードの一部です:

public enum BalanceType {
    EXTERNAL_SOURCE(BalanceCurrency.EURO),
    EXTERNAL_DESTINATION(BalanceCurrency.EURO),
    MONEY_ACCOUNT(BalanceCurrency.EURO),
    CREDIT_ACCOUNT(BalanceCurrency.CREDIT);

    private BalanceCurrency currency;

    private BalanceType(BalanceCurrency currency) {
        this.currency = currency;
    }

    public BalanceCurrency getCurrency() {
        return currency;
    }
}

私はこのカスタムシリアライザーを使用しています:

public class BalanceTypeSerializer extends JsonSerializer<BalanceType> {

    @Override
    public void serialize(BalanceType balanceType, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeStringField("value", balanceType.toString());
        jsonGenerator.writeStringField("currency", balanceType.getCurrency().toString());
        jsonGenerator.writeEndObject();
    }
}

これは、Spring MVCメソッドからの(リスト内の)戻り値として使用される(簡略化された)クラスです。

public class Balance {
    private ObjectId id;
    private ObjectId userId;
    @JsonSerialize(using = BalanceTypeSerializer.class)
    private BalanceType type;
    private double balance;
    private Date lastUpdated;

    // getters and setters
}

そして、これはSpringMVCメソッド自体の簡略化されたコードです。

@RequestMapping(value = "api/balance", method = RequestMethod.GET)
@ResponseBody
public List<Balance> getBalanceJSON(@ModelAttribute("userId") ObjectId userId, Locale locale){
    List<Balance> balanceList = balanceRepo.findByUserId(userId);
    return balanceList;
}

このメソッドでは、Springによって提供されたロケールがありますが、このロケールをシリアライザーオブジェクトに渡すにはどうすればよいですか?また、MessageSourceAwareを実装して、シリアライザーのSpring "MessageSource"クラスにアクセスしたいのですが、このクラスはSpringによってインスタンス化されていないため、この方法では実行できず、注入もできません。 。お願いします、これを行うためのいくつかのヒント、またはより良い、より簡単なアプローチを教えてください。

前もって感謝します。

4

2 に答える 2

1

この場合、これを処理するいくつかの方法を考えることができます。1つの解決策は、クラスのラッパークラスを作成することです。このクラスは、カスタムシリアライザーを作成するオブジェクトBalanceも取得します。Locale次に、にアクセスしてフィールドを手動でシリアル化できますLocale。ただし、これは多くの手作業であるため、通常、その解決策を提案することはありません。

コンテキストデータを渡す別の方法は、コンテキストサービスを使用することです。この場合、Localeインスタンスはコンテキストデータです。たとえばLocale、現在のWebリクエストのを保持できるSpringマネージドBean、またはThreadContextを保持する変数がある場合Localeです。Springには、これを行うSpringMVC用に構築されたヘルパークラスがいくつかあります。を決定する方法によっては、 LocaleContextHolderを直接使用することも検討できますLocale。これらのクラスのほとんどは静的メソッドを使用していると思うので、Spring以外のマネージドBeanでも利用できます。

于 2013-02-09T08:01:23.753 に答える
1

SerializerProviderのgetLocale()メソッドを使用できます

于 2016-06-19T12:25:57.707 に答える