spring 集成:如何从 Spring 控制器调用 Spring 集成?
spring integration: How do I call the Spring Integration from Spring Controller?
拜托,你能帮帮我吗?
所有源代码都在这里。
(https://github.com/mcvzone/integration-tcp-test.git)
谢谢。
1.我创建了一个 spring integration-tcp-client context xml 文件。
<int:gateway id="gw"
service-interface="com.example.demo.module.SimpleGateway"
default-request-channel="input"/>
<int-ip:tcp-connection-factory id="client"
type="client"
host="localhost"
port="1234"
single-use="true"
so-timeout="10000"/>
<int:channel id="input"/>
<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="input"
reply-channel="clientBytes2StringChannel"
connection-factory="client"
request-timeout="10000"
reply-timeout="10000"/>
<int:object-to-string-transformer id="clientBytes2String"
input-channel="clientBytes2StringChannel"/>
2。我创建了一个 RestController.
@RestController
public class TcpController {
final GenericXmlApplicationContext context;
final SimpleGateway simpleGateway;
public TcpController(){
this.context = new GenericXmlApplicationContext();
context.load("classpath:META-INF/spring/integration/tcpClientServerDemo-context.xml");
context.registerShutdownHook();
context.refresh();
this.simpleGateway = context.getBean(SimpleGateway.class);
}
@RequestMapping("/tcp/test")
public String test(String name) {
//SimpleGateway simpleGateway = context.getBean(SimpleGateway.class);
String result = simpleGateway.send(name);
System.out.println("result : " + result);
return result;
}
}
3。我启动 spring 启动并打开 1234 端口(新 ServerSocket(1234)),然后我调用 url.(http://localhost:8080/tcp/test)
4。结果是错误的。
java.lang.IllegalArgumentException: unable to determine a Message or payload parameter on method
.
.
.
at com.sun.proxy.$Proxy60.send(Unknown Source) ~[na:na]
at com.example.demo.TcpController.test(TcpController.java:25) ~[classes/:na]
当我把你的代码改成这样时,它已经开始工作了:
@RequestMapping("/tcp/test")
public String test(@RequestBody String name) {
注意方法参数上的 @RequestBody
。默认情况下 Spring MVC 不知道将请求中的什么映射到此参数的参数中。所以,它被保留为 null
.
另一方面,当网关调用的参数是 null
时,Spring 集成无法创建要发送的 Message<?>
,因为负载不能是 null
.因此,您最终会遇到这样的异常。
我们可能会修改该异常消息,让最终用户更清楚地知道发生了什么。欢迎就此事提出 GH 问题!
拜托,你能帮帮我吗?
所有源代码都在这里。
(https://github.com/mcvzone/integration-tcp-test.git)
谢谢。
1.我创建了一个 spring integration-tcp-client context xml 文件。
<int:gateway id="gw"
service-interface="com.example.demo.module.SimpleGateway"
default-request-channel="input"/>
<int-ip:tcp-connection-factory id="client"
type="client"
host="localhost"
port="1234"
single-use="true"
so-timeout="10000"/>
<int:channel id="input"/>
<int-ip:tcp-outbound-gateway id="outGateway"
request-channel="input"
reply-channel="clientBytes2StringChannel"
connection-factory="client"
request-timeout="10000"
reply-timeout="10000"/>
<int:object-to-string-transformer id="clientBytes2String"
input-channel="clientBytes2StringChannel"/>
2。我创建了一个 RestController.
@RestController
public class TcpController {
final GenericXmlApplicationContext context;
final SimpleGateway simpleGateway;
public TcpController(){
this.context = new GenericXmlApplicationContext();
context.load("classpath:META-INF/spring/integration/tcpClientServerDemo-context.xml");
context.registerShutdownHook();
context.refresh();
this.simpleGateway = context.getBean(SimpleGateway.class);
}
@RequestMapping("/tcp/test")
public String test(String name) {
//SimpleGateway simpleGateway = context.getBean(SimpleGateway.class);
String result = simpleGateway.send(name);
System.out.println("result : " + result);
return result;
}
}
3。我启动 spring 启动并打开 1234 端口(新 ServerSocket(1234)),然后我调用 url.(http://localhost:8080/tcp/test)
4。结果是错误的。
java.lang.IllegalArgumentException: unable to determine a Message or payload parameter on method
.
.
.
at com.sun.proxy.$Proxy60.send(Unknown Source) ~[na:na]
at com.example.demo.TcpController.test(TcpController.java:25) ~[classes/:na]
当我把你的代码改成这样时,它已经开始工作了:
@RequestMapping("/tcp/test")
public String test(@RequestBody String name) {
注意方法参数上的 @RequestBody
。默认情况下 Spring MVC 不知道将请求中的什么映射到此参数的参数中。所以,它被保留为 null
.
另一方面,当网关调用的参数是 null
时,Spring 集成无法创建要发送的 Message<?>
,因为负载不能是 null
.因此,您最终会遇到这样的异常。
我们可能会修改该异常消息,让最终用户更清楚地知道发生了什么。欢迎就此事提出 GH 问题!