1

我正在使用自定义 JsonSerializer 来生成 Spring MVC 方法的 JSON 响应。响应中的字段之一是枚举,我想返回其值的本地化描述,而不是返回 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
}

这是 Spring MVC 方法本身的简化代码:

@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

在这种情况下,我可以想出几种方法来处理这个问题。一种解决方案是为您的类创建一个包装类,Balance该类还接受一个Locale对象,然后您将为其创建一个自定义序列化程序。然后,您可以手动序列化可以访问Locale. 不过,这是很多手工工作,所以我通常不会建议这种解决方案。

传递上下文数据的另一种方法是通过上下文服务 - 在这种情况下,Locale实例是您的上下文数据。例如,如果您有一个 Spring 托管 bean 可以保存Locale当前 Web 请求的 ,或者一个ThreadContext变量可以保存Locale. Spring 有一些为Spring MVC构建的辅助类来执行此操作。您也可以考虑直接使用LocaleContextHolder,具体取决于您如何确定Locale. 我认为这些类中的大多数都使用静态方法,因此您也可以在非 Spring 托管 bean 中使用。

于 2013-02-09T08:01:23.753 回答
1

您可以使用来自 SerializerProvider 的 getLocale() 方法

于 2016-06-19T12:25:57.707 回答