我正在实现Java RMI应用程序,在这里我需要创建从RMI服务器到REST客户端的连接。我已经使用Spring Boot创建了一个REST客户端。
我现在正在实现在RMI服务器和REST客户端之间建立连接的部分。
当我尝试使用Apache HTTP客户端发送POST请求时,出现错误。
alarmServiceImpl.java
public void saveAlarm(Alarm alarm) {
Alarm alarm1 = new Alarm();
// alarm1.getFloorNum();
// alarm1.getRoomNum();
// alarm1.getSmokeLevel();
// alarm1.getCo2level();
try(CloseableHttpClient httpclient = HttpClients.createDefault()){
HttpPost httpPost = new HttpPost("http://localhost:8080/addAlarm");
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
String json = "{\r\n" +
" \"floorNum\": \"2\",\r\n" +
" \"roomNum\": \"10\",\r\n" +
" \"smokeLevel\": \"7\",\r\n" +
" \"c02level\": \"5\",\r\n" +
"}";
StringEntity stringEntity = new StringEntity(json);
httpPost.setEntity(stringEntity);
System.out.println("Executing request " + httpPost.getRequestLine());
ResponseHandler < String > responseHandler = response -> {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
};
String responseBody = httpclient.execute(httpPost, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
} catch (IOException e) {
e.printStackTrace();
}
}
错误代码
Executing request POST http://localhost:8080/addAlarm HTTP/1.1
org.apache.http.client.ClientProtocolException: Unexpected response status: 400
at rmiServer.serviceImpl.AlarmServiceImpl.lambda$saveAlarm$0(AlarmServiceImpl.java:79)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:222)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:164)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:139)
at rmiServer.serviceImpl.AlarmServiceImpl.saveAlarm(AlarmServiceImpl.java:83)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
post方法在RMI服务器中执行,我没有显示,因为它不会影响此错误。我正在寻找的另一个解决方案是,一旦POST方法正常工作,我希望能够使用getter传递JSON变量的值,以便可以使用setter从fontend设置值。