如何使用REST

时间:2016-10-12 14:30:11

标签: rest jackson apache-camel deserialization

我想在使用rest配置的camel路由上设置全局自定义日期/时间反序列化器。 我已经找到的是Camel + Jackson : Register a module for all deserialization

但我在路线中没有unmarshal()方法,但使用

RestDefinition rest(String path)
来自

方法

 org.apache.camel.builder.RouteBuilder.

我们不使用Spring,但使用Scala和REST的简单Camel以编程方式完成所有配置(无xml)。

我目前的解决方案是使用

 @JsonDeserialize(using = classOf[MyDeserializer]) 
每个日期/时间字段上的

注释,但这不是一个令人满意的解决方案。

是否有人知道如何配置Camel以在任何地方使用自定义解串器?

1 个答案:

答案 0 :(得分:1)

默认情况下,camel使用DATES_AS_TIMESTAMPS功能。要禁用此功能,只需添加.dataFormatProperty("json.out.disableFeatures", "WRITE_DATES_AS_TIMESTAMPS")

您还可以添加自定义序列化程序:

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

并与名称json-jackson绑定

 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();           
        }       
}
}

Person.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;
    }

}