2016-03-28 24 views
0

アノテーションのミックスインを処理するジャクソンコードをサードパーティが再利用して、ジャクソン以外の注釈を混在させることはできますか?ジャクソンの注釈mixinフレームワーク

ミックスインを処理するコアのジャクソンクラスは何ですか?

+0

何をしますか?ちょっと説明してください:「mixin non-Jackson annotations」? –

+0

私はJackson以外のアノテーションにmixinsを使用したいと思います。ジャクソン以外のアノテーションを処理する独自のコードからは、特定のターゲットの注釈を取得するためにライブラリを使用します。 JDKのアノテーション規則)、またはそのターゲットのライブラリに登録されているmixin上で実行できます。ジャクソンはミックスインを扱いますが、ミックスインの機能がジャクソン以外の他の注釈にも使えるかどうかはわかりませんでした。 – XDR

答えて

1

インターフェイスcom.fasterxml.jackson.databind.ser.ContextualSerializerおよび/またはcom.fasterxml.jackson.databind.deser.ContextualDeserializerを実装する必要があります。ジャクソンはJSONをシリアライズしてデシリアライズします。これがあなたの意図でない場合は、オーバーヘッドが増え、もう1つのアプローチが改善される可能性があります(たとえば、AspectJの解決策)。

ます(デ)シリアライザーの使用方法・ジャクソンとの実装に興味がある場合:

This projectはジャクソンデータプロセッサに対する汎用データ・バインディング機能と木のモデルが含まれています。コア・ストリーミング・パーサ/ジェネレータ・パッケージ上に構築され、構成のためにJackson注釈を使用します。

分析のための優れたエントリー・ポイント:ObjectMapper

は、このコードは(ミックスインで使用される)カスタム注釈の使用を示し、どのように適切な(デ)シリアライザを実装することができる:

public class MyBean { 

    private String value; 
    public String getValue() { 
     return value; 
    } 
    public void setValue(String value) { 
     this.value = value; 
    } 
} 

///// 

import com.fasterxml.jackson.annotation.JacksonAnnotation; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@JacksonAnnotation // important so that it will get included! 
public @interface MyAnnotation { 
    public String value(); 
} 

///// 

public abstract class MyMixin { 

    @MyAnnotation("Hello") 
    public abstract String getValue(); 
} 

///// 

import com.fasterxml.jackson.core.JsonParser; 
import com.fasterxml.jackson.databind.*; 
import com.fasterxml.jackson.databind.deser.ContextualDeserializer; 
import com.fasterxml.jackson.databind.deser.std.StringDeserializer; 

import java.io.IOException; 

public class MyDeserializer extends JsonDeserializer<String> implements ContextualDeserializer { 

    private String annoValue; 

    public MyDeserializer(){} 
    public MyDeserializer(MyAnnotation ann) { 
     annoValue = ann.value(); 
    } 

    @Override 
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { 
     String serializedValue = p.getText(); 
     return serializedValue.substring(annoValue.length() + 1, serializedValue.length() - 1); 
    } 

    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty prop) throws JsonMappingException { 

     MyAnnotation ann = prop.getAnnotation(MyAnnotation.class); 
     if (ann == null) { 
      ann = prop.getContextAnnotation(MyAnnotation.class); 
     } 
     if (ann == null) { 
      return new StringDeserializer(); 
     } 
     return new MyDeserializer(ann); 
    } 

} 

///// 

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.databind.*; 
import com.fasterxml.jackson.databind.ser.ContextualSerializer; 
import com.fasterxml.jackson.databind.ser.std.StringSerializer; 

import java.io.IOException; 

public class MySerializer extends JsonSerializer<String> implements ContextualSerializer { 

    private String annoValue; 

    public MySerializer() {} 
    public MySerializer(MyAnnotation ann) { 
     annoValue = ann.value(); 
    } 

    @Override 
    public void serialize(String toSerialize, JsonGenerator gen, SerializerProvider prov) throws IOException { 
     gen.writeString(annoValue + " " + toSerialize + "!"); 
    } 

    public JsonSerializer createContextual(SerializerProvider prov, BeanProperty prop) throws JsonMappingException { 

     MyAnnotation ann = prop.getAnnotation(MyAnnotation.class); 
     if (ann == null) { 
      ann = prop.getContextAnnotation(MyAnnotation.class); 
     } 
     if (ann == null) { 
      return new StringSerializer(); 
     } 
     return new MySerializer(ann); 

    } 
} 

///// 

import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.module.SimpleModule; 

import java.io.IOException; 

public class Main { 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule(); 
     module.addSerializer(String.class, new MySerializer()); 
     module.addDeserializer(String.class, new MyDeserializer()); 
     mapper.registerModule(module); 
     mapper.addMixIn(MyBean.class, MyMixin.class); 
     MyBean bean = new MyBean(); 
     bean.setValue("World"); 
     String jsonInString = mapper.writeValueAsString(bean); 
     System.out.println(jsonInString); 
     MyBean deserialized = mapper.readValue(jsonInString, MyBean.class); 
     System.out.println(deserialized.getValue()); 
    } 
} 
+0

私はジャクソン、またはジャクソンのミックスインの使い方については問いません。私はすでにそれを知っています。私は、ジャクソン自身がアノテーションミックスインを扱うために使用するコードを、ジャクソン以外の目的でアノテーションミックスインを扱うために他の人が簡単に使用できるかどうかを尋ねています。 – XDR

+0

はい、それは私の答えでした。 MyDeserializer :: deserializeとMySerializer :: serializeは、あなたが望むものすべてを行うことができます。 –