2016-04-08 22 views
1

manyquestions, jackson ile ObjectId'dan String'a dönüştürme ile ilgilidir. Tüm cevaplar ya kendi JsonSerializer<ObjectId> 'u oluşturmayı ya da alanını @JsonSerialize(using = ToStringSerializer.class) ile ek açıklama yapmayı önerir. Ben jackson dönüştürmek isteyenYuvalanmış ObjectId, Jackson ile String'e nasıl serileştirilir?

class Whatever { 
    private Map<String, Object> parameters = new HashMap<>(); 
    Whatever() { 
    parameters.put("tom", "Cat"); 
    parameters.put("jerry", new ObjectId()); 
    } 
} 

:

Ancak, ben bir bazenObjectIds içeren haritayı, yani var

{ 
    "parameters": { 
    "tom": "cat", 
    "jerry": "57076a6ed1c5d61930a238c5" 
    } 
} 

Ama olsun:

{ 
    "parameters": { 
    "tom": "cat", 
    "jerry": { 
     "date": 1460103790000, 
     "machineIdentifier": 13747670, 
     "processIdentifier": 6448, 
     "counter": 10631365, 
     "time": 1460103790000, 
     "timestamp": 1460103790, 
     "timeSecond": 1460103790 
    } 
    } 
} 

Dönüştürmeyi 0 (İlkbahar) olarak kaydettim

public class WebappConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
    builder 
     .serializerByType(ObjectId.class, new ToStringSerializer()); 
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); 
    converters.add(converter); 
    } 
} 

ve birinci düzey ObjectIds doğru çevrilir. Jackson da iç içe olanlar dönüştürmek nasıl? Bu harita için özel dönüştürücü yazmalı mıyım? Bu Map'un birden çok kez iç içe yerleştirilebileceğini (yani başka bir harita içerebileceğini) unutmayın. Jackson her gördüğünde ObjectId'u String'a dönüştürmek istiyorum.

cevap

3

org.springframework.boot:spring-boot-starter-data-mongodb numaralı telefondan org.bson.types.ObjectId hakkında bilgi alıyorsunuzdur. Kodun benim için gayet iyi çalışıyor. Gördüğüm 1 şey, WebappConfig'un üzerinde @Configuration ek açıklamasını göstermemenizdir.

İşte benim demo projem, kendi kurulumunuzda test edebilir misiniz?

Application.java

import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 
import org.bson.types.ObjectId; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.http.converter.HttpMessageConverter; 
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; 
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Configuration 
    public static class WebappConfig extends WebMvcConfigurerAdapter { 
     @Override 
     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
      Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
      builder 
        .serializerByType(ObjectId.class, new ToStringSerializer()); 
      MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build()); 
      converters.add(converter); 
     } 
    } 

    @RestController 
    public static class MyRestController { 

     @ResponseBody 
     @RequestMapping("/") 
     public Whatever method() { 
      return new Whatever(); 
     } 
    } 

    public static class Whatever { 
     private Map<String, Object> parameters = new HashMap<>(); 

     public Whatever() { 
      parameters.put("tom", "Cat"); 
      parameters.put("jerry", new ObjectId()); 
     } 

     public Map<String, Object> getParameters() { 
      return parameters; 
     } 

     public void setParameters(Map<String, Object> parameters) { 
      this.parameters = parameters; 
     } 
    } 
} 

Tepki 127.0.0.1:8080

{ 
    "parameters": { 
    "tom": "Cat", 
    "jerry": "5709df1cf0d9550b4de619d2" 
    } 
} 

Gradle den: Bir [min oluşturduk

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-data-mongodb") 
    compile("org.springframework.boot:spring-boot-starter-web") 
} 
+0

imal * değil * çalışma örneği] (https://github.com/fracz/stackoverflow-problems/tree/jackson-nested-objectid-tostring) ve benim için de doğru şekilde eşlenmiştir. Problemi daha dikkatli araştırmam gerekiyor. Bunu kontrol ettiğiniz için teşekkür ederim, bir şey bulursam bir güncelleme gönderirim. – fracz

+0

Şimdi uygulamanın başka bir yerinde bir hata olduğunu doğrulayabilirim. “Harita”, Nesne eşleştiricisinin başka bir örneği tarafından, Bahar bağlamında kullanılan yerine krikondan dönüştürüldü. Çalışamadığı için 'ObjectId' yapılandırması uygulanmadı. Zorlandığınız için minnettar olduğum için teşekkür ederim ve hatam için üzgünüm! – fracz

İlgili konular