Camel SpringBoot POST 返回对象而不是 JSON

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

我对 Camel 完全陌生,我创建了两个简单的 REST 端点(使用 Camel 3.8.0 和 SpringBoot 2.4.3),一个 GET 和一个 POST,就像这样 -

@Component
public class CamelController extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        restConfiguration()
                .component("servlet")
                .port(8080)
                .host("127.0.0.1")
                .bindingMode(RestBindingMode.json);

        rest().post("/order")
                .produces(MediaType.APPLICATION_JSON_VALUE)
                .type(Order.class)
                .outType(Order.class)
                .to("bean:orderService?method=addOrder(${body})");

        rest().get("/order")
                .produces(MediaType.APPLICATION_JSON_VALUE)
                .to("bean:orderService?method=getOrders()");

    }
}

当我在 http://localhost:8080/order 上调用 GET 时,我得到了一个 JSON 数组(如预期),如下所示 -

[
  {
    "id": 1,
    "name": "Pencil",
    "price": 100.0
  },
  {
    "id": 2,
    "name": "Pen",
    "price": 300.0
  },
  {
    "id": 3,
    "name": "Book",
    "price": 350.0
  }
]

但是,当我使用输入在 http://localhost:8080/order 上发出 POST 请求时

{
    "name": "A4 Papers",
    "price": 55.5
}

然后它返回Object,就像-

订单(id=6,名称=A4纸,价格=55.5)

如何让它返回JSON? 喜欢-

{
    "id": 6,
    "name": "A4 Papers",
    "price": 55.5
}

我的pom.xml

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.3</version>
    <relativePath/>
</parent>

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>

    <camelVersion>3.8.0</camelVersion>
</properties>

<dependencies>
    <!-- SpringBoot -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Camel -->
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-spring-boot-bom</artifactId>
        <version>${camelVersion}</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-jackson</artifactId>
        <version>${camelVersion}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-servlet-starter</artifactId>
        <version>${camelVersion}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-spring-boot-starter</artifactId>
        <version>${camelVersion}</version>
    </dependency>

    <!-- Others -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.18</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

我的完整代码是他 - https://github.com/crsardar/hands-on-java/tree/master/hands-on-camel-springboot

如何让 POST API 返回 JSON?

java spring-boot apache-camel spring-camel
4个回答
0
投票

您的输出数据是当您使用

outType
时,您的数据(Order类型的对象)将被映射到数组列表中。您需要将数据显式转换为 json 格式。

rest()
  .post("/order")
  .produces(MediaType.APPLICATION_JSON_VALUE)
  .type(Order.class)
  .route()
    .to("bean:orderService?method=addOrder(${body})")
    .marshal().json(JsonLibrary.Jackson);

0
投票

在调用 API 之前添加封送处理。

rest().post("/order")
.produces(MediaType.APPLICATION_JSON_VALUE)
.marshal().json(JsonLibrary.Jackson, Order.class)
.to("bean:orderService?method=addOrder(${body})");

0
投票

我在引用的 Github url 上拉取了你的项目:https://github.com/crsardar/hands-on-java/tree/master/hands-on-camel-springboot,发现它在编译时抛出错误由于

camel-servlet-starter

<dependency>
   <groupId>org.apache.camel</groupId>
   <artifactId>camel-servlet-starter</artifactId>
   <version>${camel.version}</version>
</dependency>

enter image description here

然后我继续更新它以使用以下依赖项:

<dependency>
   <groupId>org.apache.camel.springboot</groupId>
   <artifactId>camel-servlet-starter</artifactId>
   <version>${camel.version}</version>
</dependency>

导入此依赖项后,我就能够运行项目,并且测试了

POST
端点
http://localhost:8080/camel/order
并获得了预期的输出

enter image description here

导致我没有进行任何代码更改,但却得到了您想要的结果,我还注意到在您的 yml 文件中您使用

/camel
作为您的
context-path
但在上面的问题中您没有使用你的休息电话,让我相信项目版本不匹配。

根据您的问题和您上面引用的 Github 项目以及我所做的调查,希望这会有所帮助。


0
投票

如果您在主路由器类中使用.skipBindingOnErrorCode(true),则在Rest定义中,只需设置.skipBindingOnErrorCode(false)。并从您的路由中删除 .marshal().json(JsonLibrary.Jackson),仅需要在 Exchange().getMessage().setBody(response , YourObject.class) 中设置的对象。

© www.soinside.com 2019 - 2024. All rights reserved.