2016-10-12 12 views
0

restで設定されたラクダルートにグローバルカスタム日付/タイムデシリアライザを設定したいとします。 私はすでに見つかっていることCamel + Jackson : Register a module for all deserializationRESTを使用してキャメルウォールスプリングでグローバルカスタムジャクソンデシリアライザを設定する方法

あるしかし、私は、ルートにアンマーシャリング()メソッドを持っていますが、私たちは春を使用していない

org.apache.camel.builder.RouteBuilder. 

から

RestDefinition rest(String path) 

メソッドを使用しないでくださいScalaとRESTを使用したCamelはすべてプログラムで(xmlなしで)すべての設定を完了しました。

私の現在のソリューションは、すべての日付/時刻フィールドに

@JsonDeserialize(using = classOf[MyDeserializer]) 

アノテーションを使用することであるが、それは満足のいく解決策ではありません。

誰かがどこにカスタムデシリアライザを使用するようにCamelを設定するかを手がかりにしていますか?

答えて

1

デフォルトでは、キャメルはDATES_AS_TIMESTAMPS機能を使用します。

module.addSerializer(Date.class, sample.new DateSerializer()); 

と名前のJSON-ジャクソン

jndiContext.bind("json-jackson", jackson); 

例との結合:

import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.GregorianCalendar; 

import org.apache.camel.CamelContext; 
import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.component.jackson.JacksonDataFormat; 
import org.apache.camel.impl.DefaultCamelContext; 
import org.apache.camel.model.rest.RestBindingMode; 
import org.apache.camel.spi.DataFormat; 
import org.apache.camel.util.jndi.JndiContext; 

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.core.Version; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializerProvider; 
import com.fasterxml.jackson.databind.module.SimpleModule; 


public class Samlpe3 { 

    public static void main(String[] args) throws Exception { 
     Samlpe3 sample = new Samlpe3(); 

     //custom mapper 
     ObjectMapper objectMapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule("DefaultModule", new Version(0, 0, 1, null, null, null)); 
     module.addSerializer(Date.class, sample.new DateSerializer()); 
     module.addSerializer(Person.class, sample.new PersonSerializer()); 
     objectMapper.registerModule(module); 
     JacksonDataFormat jackson = new JacksonDataFormat(objectMapper, null); 
     JndiContext jndiContext = new JndiContext(); 
     jndiContext.bind("json-jackson", jackson); 

     CamelContext context = new DefaultCamelContext(jndiContext); 

     context.addRoutes(new RouteBuilder() { 
      public void configure() throws Exception {    
        restConfiguration().component("jetty").bindingMode(RestBindingMode.json) 
        .host("0.0.0.0").contextPath("/test").port(8080)      
        //disableFeatures WRITE_DATES_AS_TIMESTAMPS 
        .dataFormatProperty("json.out.disableFeatures", "WRITE_DATES_AS_TIMESTAMPS")      

        ; 
        rest("/v1/").produces("application/json") 
        .get("persons") 
        .to("direct:getPersons"); 

        from("direct:getPersons") 
         .process(new Processor() {      
          public void process(Exchange exchange) throws Exception {         
           exchange.getIn().setBody(new Person("Sergey", new GregorianCalendar().getTime())); 
          } 
        }) 
        ; 
       } 
      }); 

     context.start(); 
     Thread.sleep(60000); 
     context.stop(); 
    } 
public class DateSerializer extends JsonSerializer<Date> { 
    @Override 
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) 
      throws IOException, JsonProcessingException { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
     String date = sdf.format(value); 
     gen.writeString(date);  
     } 
    } 
public class PersonSerializer extends JsonSerializer<Person> { 
     @Override 
     public void serialize(Person value, JsonGenerator gen, SerializerProvider serializers) 
       throws IOException, JsonProcessingException { 
      gen.writeStartObject(); 
      gen.writeFieldName("Changed_n"); 
      gen.writeObject(value.getName() + " Changed"); 
      gen.writeFieldName("Changed_b"); 
      gen.writeObject(value.getBirthday()); 
      gen.writeEndObject();   
     }  
} 
} 

人が、このfeatuerを無効にすることだけでも、カスタム・シリアライザを追加することができます.dataFormatProperty("json.out.disableFeatures", "WRITE_DATES_AS_TIMESTAMPS")

を追加します。 java:

import java.util.Date; 

public class Person { 
    private String name; 
    private Date birthday; 

    Person(String name, Date birhday){ 
     System.out.println("Person"); 
     this.setBirthday(birhday); 
     this.setName(name); 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Date getBirthday() { 
     return birthday; 
    } 
    public void setBirthday(Date birthday) { 
     this.birthday = birthday; 
    } 

} 
関連する問題