我对 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?
您的输出数据是当您使用
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);
在调用 API 之前添加封送处理。
rest().post("/order")
.produces(MediaType.APPLICATION_JSON_VALUE)
.marshal().json(JsonLibrary.Jackson, Order.class)
.to("bean:orderService?method=addOrder(${body})");
我在引用的 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>
然后我继续更新它以使用以下依赖项:
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-servlet-starter</artifactId>
<version>${camel.version}</version>
</dependency>
导入此依赖项后,我就能够运行项目,并且测试了
POST
端点 http://localhost:8080/camel/order
并获得了预期的输出
导致我没有进行任何代码更改,但却得到了您想要的结果,我还注意到在您的 yml 文件中您使用
/camel
作为您的 context-path
但在上面的问题中您没有使用你的休息电话,让我相信项目版本不匹配。
根据您的问题和您上面引用的 Github 项目以及我所做的调查,希望这会有所帮助。
如果您在主路由器类中使用.skipBindingOnErrorCode(true),则在Rest定义中,只需设置.skipBindingOnErrorCode(false)。并从您的路由中删除 .marshal().json(JsonLibrary.Jackson),仅需要在 Exchange().getMessage().setBody(response , YourObject.class) 中设置的对象。