gpt4 book ai didi

java - 如何将参数传递给 JsonSerializer?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:59 27 4
gpt4 key购买 nike

我有一个简单的数据服务:

@GET
public Data getData(@QueryParam("id") Long id) {
Data data = dataService.getData(id);
return data;
}

还有一个匹配的DataSerializer实现 JsonSerializer<Data> :DataSerializer通过以下方式注册到 jackson :

simpleModule.addSerializer(Data.class , dataSerializer);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(simpleModule);

效果很好。但是今天,我想再添加一个 Locale参数,并希望 DataSerializer输出对应的内容:

@GET
public Data getData(@QueryParam("id") Long id , @QueryParam("locale") Locale locale)

' Data ' 本身包含各种语言环境变体,我希望得到分配的语言环境输出。

但是当我得到 locale从参数中,我不知道如何传递 locale DataSerializer 的值……

有什么办法可以做到这一点吗?

除了这个解决方案:

Data data = dataService.getData(id.get() , locale);

这不是我想要的。

好像ThreadLocal是实现这一目标的唯一方法,但我觉得那很丑陋。还有其他可行的解决方案吗?

谢谢。

环境:dropwizard-0.7.0-rc2,jackson-core:jar:2.3.1

=====================更新==========

回复@andrei-i :

因为我的数据本身已经包含了各种语言环境版本。例如:

Data helloData = dataService.get("hello");
helloData.getName(Locale.English) == "Hello";
helloData.getName(Locale.France) == "Bonjour";
helloData.getName(Locale.Germany) == "Hallo";

我想直接将语言环境从 URL 传递给 JsonSerializer ,以获得一个版本的数据表示。

并且“可能”有其他版本(不仅仅是语言环境),因此,不考虑继承数据混合语言环境。

最佳答案

我知道这不是一个新问题,但这是我在面对类似问题时想到的:

  1. 创建自定义注释:

    @Target({ ElementType.FIELD, ElementType.TYPE, ElementType.METHOD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface JsonLocalizable {

    public String localizationKey();
    }
  2. jackson 序列化器:

     public class LocalizingSerializer extends StdSerializer<String> implements ContextualSerializer {

    private String localizationKey;

    public LocalizingSerializer() {
    super(String.class);
    }

    public LocalizingSerializer(String key) {
    super(String.class);

    this.localizationKey = key;
    }

    @Override
    public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {

    String localizedValue = //.... get the value using localizationKey

    jgen.writeString(localizedValue);
    }

    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {

    String key = null;
    JsonLocalizable ann = null;

    if (property != null) {
    ann = property.getAnnotation(JsonLocalizable.class);
    }

    if (ann != null) {
    key = ann.localizationKey();
    }

    //if key== null??

    return new LocalizingSerializer(key);
    }
    }
  3. 注释您要本地化的字段:

    public class TestClass {

    @JsonSerialize(using = LocalizingSerializer.class)
    @JsonLocalizable(localizationKey = "my.key")
    private String field;

    public String getField() {
    return this.field;
    }

    public void setField(String field) {
    this.field = field;
    }
    }

关于java - 如何将参数传递给 JsonSerializer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22634860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com