gpt4 book ai didi

java - Red Hat 上的 Weblogic 上的同一应用程序收到 400 个错误请求

转载 作者:行者123 更新时间:2023-12-01 14:45:57 24 4
gpt4 key购买 nike

我一直在开发一个提供 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..但我对此很陌生。继tutorial来自沃盖拉。

这是我的通知类:

@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}

最佳答案

在这种情况下,400 响应可能表示在解码 POST 正文时出现某种错误。

使用@XMLRootElement就可以了。但是,您在将 JAXB 解码为原始类型时可能会遇到问题(取决于您拥有的版本)。

让 JAXB 解码您的 Notification 对象的最安全方法是使用 Integer 类型而不是原始 int 类型。

@XmlRootElement
public class Notification {
private Integer applicationId;

/* and the rest... */
}

此外,如果您使用 @XmlRootElement 注释,则不需要用 JAXBElement 包装 Notification 对象。尝试删除 JAXBElement 包装器:

@POST
@Path("testRest")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public static NotificationResponse testRest(Notification n) {
logger.info("yo!");
return new NotificationResponse(101, "yo");
}
<小时/>

如果问题仍然存在,那么您始终可以使用 MessageBodyReader 手动解码请求正文。

对 JSON 请求正文执行此操作的典型方法是实现 MessageBodyReader 并使用您选择的 JSON 解析器,例如 Gson 或 Jackson。

@Provider
@Consumes("application/json")
public class CustomJsonReader<T> implements MessageBodyReader<T> {

@Override
public boolean isReadable(Class<?> type, Type genericType,
Annotation[] annotations,MediaType mediaType) {
return true;
}

@Override
public T readFrom(Class<T> type, Type genericType, Annotation[] annotations,
MediaType mediaType, MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException {

/* Convert the request body (passed in as InputStream) to a String.
* Here I'm using apache commons IOUtils to convert the input stream
*/
StringWriter writer = new StringWriter();
IOUtils.copy(entityStream, writer, "UTF-8");
String json = writer.toString();

/* Use JSON parser to unmarshal the JSON to a complex object */
return new Gson().fromJson(json, genericType);
}
}

关于java - Red Hat 上的 Weblogic 上的同一应用程序收到 400 个错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15435899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com