jsonformat example java jackson jax-rs dropwizard jsonserializer

example - jsonserializer date java



¿Cómo pasar el parámetro a JsonSerializer? (2)

Tengo un servicio de datos simple:

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

Y un DataSerializer coincidente que implementa JsonSerializer<Data> : The DataSerializer está registrado a Jackson a través de:

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

Funciona bien. Pero hoy, quiero agregar otro parámetro de configuración Locale , y espero que el DataSerializer contenido correspondiente:

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

El '' Data '' en sí mismo contiene varias variaciones locales, y espero obtener la salida local asignada.

Pero cuando obtengo la locale del parámetro, no sé cómo pasar el valor de locale al DataSerializer ...

¿Hay alguna forma de lograr esto?

Excepto esta solución:

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

que no es lo que quiero

Parece que ThreadLocal es la única forma de lograr esto, pero siento que es feo. ¿Alguna otra solución factible?

Gracias.

Entornos: dropwizard-0.7.0-rc2, jackson-core: jar: 2.3.1

===================== actualizado ==========

responder a @ andrei-i:

Porque mis datos ya contienen varias versiones de configuración regional. por ejemplo :

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

Quiero pasar directamente la configuración regional de URL a JsonSerializer, para obtener una versión de la presentación de datos.

Y puede que haya otra versión (no solo la configuración regional), por lo que no se tiene en cuenta la herencia de la configuración regional de mezcla.


Solución 1. En su implementación JAX-RS registre su propia implementación de MessageBodyWriter para solicitudes JSON. Probablemente su implementación extenderá a Jackson. También es posible que deba cancelar el registro de Jackson. En un MessageBodyWriter puede inyectar una instancia de UriInfo utilizando la anotación @Context , y con ella puede obtener cualquier parámetro de solicitud.

Solución 2. Cambie la arquitectura de sus Data , para que sea compatible con la configuración regional. Por ejemplo, cree un setter setLocale() que cambiará los datos devueltos, si se configuró la configuración regional.


Sé que esta no es una pregunta nueva, pero esto es lo que surgió al enfrentar el problema similar:

  1. anotación personalizada creada:

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

  2. Serializador 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. Anota el campo que deseas localizar:

    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; } }