2011-12-01 17 views
6

Jackson json kütüphanesiyle, @JsonCreator kullanımıyla nesnenin seri hale getirilmesi mümkündür ve aşağıdaki gibi giriş jsonunu temsil eden "üst düzey" harita verilir:@JacksonInject with En üst düzey bir harita üzerinde @JsonCreator kullanın

{ 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3" 
} 
01:

class MyClass { 
    final int field; 

    public MyClass(int theInt) { 
     this.field = theInt; 
    } 

    @JsonCreator 
    static MyClass create(Map<String, Object> map) { 
     return new MyClass((int) map.get("theInt")); 
    } 
} 

önceki örnekler json aşağıdaki giriş tür işleyebilir:

class MyClass { 
    final int field; 

    @JsonCreator 
    public MyClass(Map<String, Object> map) { 
     this.field = (int) map.get("theInt"); 
    } 
} 

hatta statik fabrika yöntemi

Bu özellikle benim durumumda kullanışlıdır çünkü bilmediğim bir yapıyı bir json'u kaldırmak istiyorum. "Üst düzey harita" dediğim şeye erişim vermek işleri kolaylaştırıyor.

Nesnelerimi, bu özelliğe izin vermeyen @JsonAnySetter ve özellik adını bilmediğim @JsonProperty kullanmak yerine, değiştirilemeyen nesneler oluşturulmasına olanak sağladığından bu şekilde ayırmak istiyorum. önceden bahsettiğim gibi önceden.

Sonra benim fabrika yönteminde bazı yapılandırma enjekte etmek istiyorum, daha ileri gitmek ve Jackson @JacksonInject kullanımı ve ObjectMapper üzerinde withInjectableValues(InjectableValues) bir çağrı yoluyla buna izin verir. Sonunda

Bu I kullanmak istiyorum kod türü: Maalesef

class MyClass { 
    final MyField[] myFields; 

    public MyClass(MyField... myFields) { 
     this.myFields = myFields; 
    } 

    @JsonCreator 
    static MyClass create(@JacksonInject("conf") Conf conf, Map<String, Object> map) { 
     MyFields[] myFields; 
     // initialize myFields (or any other object) based on the content of map 
     // and also make use of the inject conf 
     return new MyClass(myFields); 
    } 
} 

Jackson istisnalar aşağıdaki tür atar: yapıcı hile çalışırken

JsonMappingException: Argument #1 of constructor [constructor for MyClass, annotations: {[email protected]()}] has no property name annotation; must have name when multiple-paramater constructor annotated as Creator

  • kimse ben sorunu nasıl çözebileceklerini biliyor mu

JsonMappingException: Argument #1 of factory method [method create, annotations: {[email protected]()}] has no property name annotation; must have when multiple-paramater static method annotated as Creator

fabrika yöntemine hile çalışıyor?

  • üst düzey haritasına erişim
  • değişmez bir nesne oluşturmak için (peşin json özellik adlarını bilmiyorum) (şimdiye olamaz: gereklerini Özetle

    , ihtiyacım

şöyle json giriş biçimini değiştiremez @JsonCreator dekore yapıcı veya fabrika yöntemine bazı conf enjekte etmek) @JsonAnySetter kullanın:

{ 
    "key1":"value1", 
    "key2":"value2", 
    "key3":"value3" 
} 

Bu bilinen bir sorundur edilir

[DÜZENLE]: http://jira.codehaus.org/browse/JACKSON-711 (henüz sabit değil)

cevap

4

Doğru, hem "delege" yaratıcısı (tek argüman kullanmak istiyorum hangi JSON giriş içine ilk sınırlıdır) - adlandırılan parametreler kümesinin geçtiği "özellik tabanlı" yaratıcısından farklı - ve enjekte edilebilir değer (ler). Bu ideal olarak çalışmalı, ama şu an işe yaramayabilir. Bunun için bir Jira girildiğini düşünüyorum, bu yüzden kontrol edebilirsiniz (http://jira.codehaus.org/browse/JACKSON).

Sadece emin olmak için: 1.9.2 sürümünü mi kullanıyorsunuz? Bunun içinde bazı düzeltmeler var 1.9.0 beri; En azından daha iyi bir hata mesajı verecekti.

+0

Gerçekten de bu bileti öğrendim: http://jira.codehaus.org/browse/JACKSON-711 – killy971

+0

Ah evet. Bunun için oy verdiğinizden emin olun - dediğim gibi işe yarayacaktır, ancak maalesef sadece uygulama yönlerinden dolayı destekleyici zorlayıcı kombinasyonlardan biridir. – StaxMan