Apache Camel中的类型转换错误

问题描述 投票:0回答:1

我正在做一个POC,关于Apache Camel是否能满足我作为一个请求聚合器的要求。

比方说,我有一个现有的系统,我在两个不同的服务上创建用户。因此,我希望用Camel将这两个步骤聚合成一个单一的聚合请求。我有两个不同的问题。

  • 聚合器模式是正确的方式吗?意思是,在最后,如果我对第一个服务的调用因为任何原因失败,我希望整个请求失败。
  • 其次,[请理解我对Camel还是个新手,请指正]我尝试实现了一个基本的流程,在这个流程中,我想做一些转换,我想从DemoUserRequest中提取用户名字中的第一个名字,并将其传递给DemoUserMS1Request,如下图所示,之后调用MS2。
    @Component
public class DemoRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        restConfiguration()
                .component("servlet")
                .bindingMode(RestBindingMode.json)
                .dataFormatProperty("prettyPrint", "true");

        rest("/api/v1")
                .description("Create user flow")
                .id("create-user")
                .consumes(MediaType.APPLICATION_JSON_VALUE)
                .produces(MediaType.APPLICATION_JSON_VALUE)
                .post("/user")
                .to("direct:createUser");

        from("direct:createUser")
                .log(" :: ${body} ")
                .marshal().json(JsonLibrary.Jackson)
                .unmarshal().json(JsonLibrary.Jackson, DemoUserRequest.class)
                .process(new Processor() {
                    @Override
                    public void process(Exchange exchange) throws Exception {
                        Message message = exchange.getIn();
                        DemoUserRequest demoUserRequest = exchange.getIn(DemoUserRequest.class);
                        log.info("DemoUserRequest toString : " + demoUserRequest.toString());
                        DemoUserMS1Request demoUserMS1Request = new DemoUserMS1Request(demoUserRequest.getUserID(),
                                                                    demoUserRequest.getUserName(),
                                                                    demoUserRequest.getUserLanguage(),
                                                                    demoUserRequest.getUserName()
                                                                            .substring(0, demoUserRequest.getUserName().indexOf(' ')));
                        message.setBody(demoUserMS1Request);
                    }
                })
                .marshal().json(JsonLibrary.Jackson, DemoUserMS1Request.class)
                .setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
//                .toD("{{ms1.url}}/api/createUser");
                .to("stream:out");
    }
}
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class DemoUserRequest {
    private String userID;
    private String userName;
    private String userLanguage;
}
@Data
@AllArgsConstructor
public class DemoUserMS1Request {
    private String userID;
    private String userName;
    private String userLanguage;
    private String userFirstName;
}
@Data
public class DemoUserMS2Request {
    private String userName;
}

我在请求

curl --location --request POST 'http://localhost:8081/api/v1/user' \
--header 'Content-Type: application/json' \
--data-raw '{
    "userID" : "1",
    "userName" : "abc def",
    "userLanguage" : "EN"
}'

骆驼抛出的错误有

java.lang.NullPointerException
    at com.unbxd.hagrid.routes.DemoRoute$1.process(DemoRoute.java:42)

[在log.info行]有什么办法可以把我的JSON请求投到我的POJOs中吗?

java apache-camel aggregation dsl
1个回答
1
投票

在你有的地方。

DemoUserRequest demoUserRequest = exchange.getIn(DemoUserRequest.class);

你应该改成:

DemoUserRequest demoUserRequest = exchange.getIn().getBody(DemoUserRequest.class);
© www.soinside.com 2019 - 2024. All rights reserved.