2017-01-14 2 views
0

Давайте сделаем вид, что у меня есть собственный сериализатор, определенный следующим образом:Как настроить Jackson для получения сериализатора с помощью статического метода getInstance()?

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.core.JsonStreamContext; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.SerializerProvider; 

import java.io.IOException; 

@SingletonSerializer // my custom annotation 
public final class ThumbnailUrlSerializer extends JsonSerializer { 

    private static final ThumbnailUrlSerializer INSTANCE = new ThumbnailUrlSerializer(); 

    public static ThumbnailUrlSerializer getInstance() { 
     return INSTANCE; 
    } 

    private ThumbnailUrlSerializer() { 
    } 

    @Override 
    public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException { 
     final JsonStreamContext context = gen.getOutputContext(); 
     if ("thumbnailUrl".equals(context.getCurrentName()) && value == null) { 
      gen.writeStringField(context.getCurrentName(), "FOO"); 
     } else { 
      gen.writeStringField(context.getCurrentName(), (String) value); 
     } 
    } 
} 

Поле помечается использовать этот сериалайзер:

import com.fasterxml.jackson.databind.annotation.JsonSerialize; 

public class Product { 

    private String primaryKey; 

    @JsonSerialize(using = ThumbnailUrlSerializer.class) 
    private String thumbnailUrl; 

    public String getPrimaryKey() { 
     return primaryKey; 
    } 

    public void setPrimaryKey(String primaryKey) { 
     this.primaryKey = primaryKey; 
    } 

    public String getThumbnailUrl() { 
     return thumbnailUrl; 
    } 

    public void setThumbnailUrl(String thumbnailUrl) { 
     this.thumbnailUrl = thumbnailUrl; 
    } 
} 

Я думаю, с помощью настраиваемого com.fasterxml.jackson.databind.ObjectMapper#setSerializerProvider или com.fasterxml.jackson.databind.ObjectMapper#setSerializerFactory, то можно это сделать, но я не знаю, как.

Любые идеи, как я могу это сделать?

ответ

0

Пользовательские Serializer:

public class ThumbnailUrlSerializer extends StdSerializer<Product> { 

    private ThumbnailUrlSerializer(Class<Product> t) { 
     super(t); 

    } 

    private static final ThumbnailUrlSerializer INSTANCE = new ThumbnailUrlSerializer(Product.class); 

    public static ThumbnailUrlSerializer getInstance() { 
     return INSTANCE; 
    } 

    @Override 
    public void serialize(Product product, JsonGenerator gen, SerializerProvider sp) throws IOException { 
      final JsonStreamContext context = gen.getOutputContext(); 
      if ("thumbnailUrl".equals(context.getCurrentName()) && product == null) { 
       gen.writeStringField(context.getCurrentName(), "FOO"); 
      } else { 
       gen.writeStringField(context.getCurrentName(), (String) product.getThumbnailUrl()); 
      } 

    } 

} 

Использование:

 ObjectMapper mapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule(); 
     module.addSerializer(Product.class, ThumbnailUrlSerializer.getInstance()); // singleton usage 
     mapper.registerModule(module); 

     String json = mapper.writeValueAsString(product); 
     System.out.println("output "+json); 

Я надеюсь, что это помогает!

+0

Не совсем. Я хочу, чтобы аннотировать поле с помощью 'JsonSerialize' и настроить поставщик или фабрику сериализатора, который знает, чтобы вызывать' getInstance' с сериализаторами, которые аннотируются с помощью «SingletonSerializer», как в моем примере кода. – Outkast

Смежные вопросы