我一直在开发一个提供 REST 服务的应用程序。我有一些经过测试的代码,我针对它运行,看看它是否可以正常工作。
针对部署在本地 Weblogic 开发服务器上的应用程序运行它时,它运行良好。
但是,当我将它部署到 Red Hat 机器上的另一个 Weblogic 服务器上时,我收到 400 Bad Request 错误。
这是我用来测试服务的客户端代码:
Client client = Client.create();
//WebResource webResource = client.resource("http://10.1.1.2:7001/NotificationFramework/rest/notifications/createNotification");
WebResource webResource = client.resource("http://rhvm:7003/NotificationFramework/rest/notifications/createNotification");
ClientResponse clientResponse = webResource.type("application/json").post(ClientResponse.class, testJsonObject.toString());
JSONObject response2 = new JSONObject(clientResponse.getEntity(String.class));
System.out.println(response2);
注释行是我本地机器上的行。
这是我得到的回复:
An error occurred: Server returned HTTP response code: 400 for URL: http://rhvm:7003/NotificationFramework/rest/notifications/createNotification
以下是提供 REST 服务的代码摘录:
@Path("/notifications")
public class RestServices {
@POST
@Path("/createNotification")
@Consumes( {MediaType.APPLICATION_JSON} )
@Produces( {MediaType.APPLICATION_JSON} )
public static NotificationResponse createNotification(JAXBElement<Notification> n) {
// do some stuff
return notificationResponse;
}
我已经尝试在末尾添加一个额外的 / 。我已经使用 Firefox 的 RESTClient 插件对其进行了测试,并且得到了完全相同的行为。
任何帮助将不胜感激。
提前致谢。
// 编辑
我发现这与 JAXBElement 有关。
以下服务有效:
@POST
@Path("testRest3")
@Consumes( {MediaType.APPLICATION_JSON} )
@Produces({MediaType.APPLICATION_JSON})
public static NotificationResponse testRest3() {
logger.info("yo3");
return new NotificationResponse(101, "yo");
}
但以下没有:
@POST
@Path("testRest4")
@Consumes( {MediaType.APPLICATION_JSON} )
@Produces({MediaType.APPLICATION_JSON})
public static NotificationResponse testRest4(JAXBElement<Notification> n) {
logger.info("yo4");
return new NotificationResponse(101, "yo");
}
我按照pestrella 的建议检查了Notification 类,发现@XmlRootElement 丢失了。我添加了这个,但这仍然没有解决问题。我不确定它是否应该是@Xml .. 但我是新手。遵循 vogella 的教程。
这是我的通知类:
@XmlRootElement
public class Notification {
private int applicationId;
private int notificationId;
private int priority;
private String message;
private String detail;
private String appUrl;
// methods and stuff
}
这是与 Firefox 的 RESTClient 插件一起提交的正文:
{"appUrl":"","message":"my message","notificationId":1110001,"detail":"my detail","priority":3,"applicationId":111}