过程适用于变换不能的过程

时间:2017-04-05 00:16:32

标签: apache-camel

我试图在Camel上点击一个REST端点并将该数据转换为一个类(为简单起见,并测试将该类转换为JSON字符串)并对本地服务器进行POST。我可以做到这一切,但做了最后的帖子,似乎挂了。

应用:

@SpringBootApplication
public class App {

    /**
     * A main method to start this application.
     */
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Component
    public class RestTest extends RouteBuilder {
        @Override
        public void configure() throws Exception {
            restConfiguration().component("restlet").host("localhost").port(8000).bindingMode(RestBindingMode.json);

            rest("/test").enableCORS(true)
                    .post("/post").type(User.class).to("direct:transform");

            from("direct:transform")
                    .transform().method("Test", "alter")
                    .to("http4:/localhost:8088/ws/v1/camel");
        }
    }

}

豆:

@Component("Test")
public class Test {
    public void alter (Exchange exchange) {
        ObjectMapper mapper = new ObjectMapper();

        User body = exchange.getIn().getBody(User.class);

        try {
            String jsonInString = mapper.writeValueAsString(body);

            exchange.getOut().setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.POST));
            exchange.getOut().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON);
            exchange.getOut().setBody(jsonInString);

        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

用户:

public class User {
    @JsonProperty
    private String firstName;

    @JsonProperty
    private String lastName;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }
}

更新

能够让它与进程一起工作而不是转换,但是当响应从POST发送回Camel时出现错误:

from("direct:transform")
                    .process(new Processor() {
                        public void process(Exchange exchange) throws Exception {
                            ObjectMapper mapper = new ObjectMapper();

                            User body = exchange.getIn().getBody(User.class);

                            try {
                                String jsonInString = mapper.writeValueAsString(body);

                                exchange.getOut().setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.POST));
                                exchange.getOut().setHeader(Exchange.CONTENT_TYPE, MediaType.APPLICATION_JSON);
                                exchange.getOut().setBody(jsonInString);

                            } catch (JsonGenerationException e) {
                                e.printStackTrace();
                            } catch (JsonMappingException e) {
                                e.printStackTrace();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    })
                    .to("http4://0.0.0.0:8088/ws/v1/camel");

错误

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.apache.camel.converter.stream.CachedOutputStream$WrappedInputStream and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:284)
    at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110)
    at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135)
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69)
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1429)
    at com.fasterxml.jackson.databind.ObjectWriter._configAndWriteValue(ObjectWriter.java:1158)
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:988)
    at org.apache.camel.component.jackson.JacksonDataFormat.marshal(JacksonDataFormat.java:155)
    at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:69)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
    at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:50)
    at org.apache.camel.component.rest.RestConsumerBindingProcessor$RestConsumerBindingMarshalOnCompletion.onAfterRoute(RestConsumerBindingProcessor.java:363)
    at org.apache.camel.util.UnitOfWorkHelper.afterRouteSynchronizations(UnitOfWorkHelper.java:154)
    at org.apache.camel.impl.DefaultUnitOfWork.afterRoute(DefaultUnitOfWork.java:278)
    at org.apache.camel.processor.CamelInternalProcessor$RouteLifecycleAdvice.after(CamelInternalProcessor.java:317)
    at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:246)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:109)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)
    at org.apache.camel.component.restlet.RestletConsumer$1.handle(RestletConsumer.java:68)
    at org.apache.camel.component.restlet.MethodBasedRouter.handle(MethodBasedRouter.java:54)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:639)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:639)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
    at org.restlet.Component.handle(Component.java:408)
    at org.restlet.Server.handle(Server.java:507)
    at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:63)
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:143)
    at org.restlet.engine.connector.HttpServerHelper$1.handle(HttpServerHelper.java:64)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
    at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:82)
    at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:675)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
    at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

导致过程和转换之间的根本区别是什么?

1 个答案:

答案 0 :(得分:0)

camel中的“Processor”是最低级别的消息处理原语。在封面下,转换定义作为org.apache.camel.processor.TransformProcessor执行,from("direct:transform") .transform().method("Test", "alter") .to("http4:/localhost:8088/ws/v1/camel") .unmarshal().json(JsonLibrary.Jackson, User.class); 本身就是处理器。事实上,大多数情况下都是处理器下的处理器,所以你可以用纯处理器完成转换所能完成的任何事情:

您的上一个错误是因为您需要将HTTP调用的输出解组为对象,然后才能使用Jackson将其编组回JSON。这样的事情:

{{1}}