我正在使用AJAX向RESTful Web服务发出以下PUT请求。在发出请求之前,我将表单提交(使用ng-submit)返回的数据转换为JSON字符串:
var serializedData =angular.toJson(person);
然后我将它作为数据发送到这样的AJAX调用中:
$http({
method: 'PUT',
url: myurl +person.personID,
data: serializedData,
headers: {
'Content-Type': 'application/json'
}
}).success(function(data) {
console.log("Success");
});
现在在我的Web服务中,我想获取这些数据并创建一个Java对象:
@PUT
@Path("/person/{id}")
@Produces({ MediaType.APPLICATION_JSON })
@Consumes({MediaType.APPLICATION_JSON})
public Response updatePerson(@PathParam("id") String personID,
@Context HttpServletRequest httpRequest) {
Response.ResponseBuilder builder = Response.ok();
Person person =null;
String data =null;
BufferedReader reader =null;
StringBuffer buffer = new StringBuffer();
try
{
reader = new BufferedReader(new InputStreamReader(httpRequest.getInputStream()));
}
catch (IOException e1)
{
e1.printStackTrace();
e1.getCause().toString();
}
try
{
while((data =reader.readLine()) != null){
buffer.append(data);
}
}
catch (IOException e1)
{
e1.printStackTrace();
}
String bufferToString =buffer.toString();
try
{
person =JSONUtil.toObject(bufferToString, new TypeReference<Person>() {});
}
catch (JsonParseException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (JsonMappingException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (person == null) {
builder = Response
.status(Response.Status.NOT_FOUND.getStatusCode());
return builder.build();
}
try {
deviceService.update(dev);
JSONUtil.toJSONString(dev);
builder.entity(JSONUtil.toJSONString(dev));
} catch (JsonGenerationException e) {
} catch (JsonMappingException e) {
} catch (IOException e) {
return builder.build();
}
这是一个我似乎无法弄清楚的问题。当进行ajax调用时,数据会到达Web服务,这意味着它是一个JSON字符串,因为这是angular.toJson
所做的[https://docs.angularjs.org/api/ng/function/angular.toJson]。用读取器读取它并将其转换为字符串并将其传递给JSONUtil.toObject(bufferToString, new TypeReference<Person>() {});
后,它会给我一个404状态代码,这意味着person对象为null。现在这是我不明白的奇怪的事情。如果我在POSTMAN客户端中对Person对象执行get请求,请编辑该JSON中的值并将其作为application / json类型的主体发送到PUT请求(来自POSTMAN),然后它就可以了。我已经通过JSONLint检查了我从AJAX收到的JSON字符串是否有效..为什么会发生这种情况?我将一个字符串传递给JSONUtil.toObject(bufferToString, new TypeReference<Person>() {});
,这是该方法所需要的。它的格式不正确吗?我似乎无法理解。任何帮助将不胜感激。现在已经坚持了4个小时。谢谢。
答案 0 :(得分:1)
我发布这个作为答案,因为我还没有发表评论。以下是重构代码以使其更容易保持的建议。如果不这样做,我建议您在控制台上发布StackTrace,以提供进一步的帮助。
现在建议: 你应该试试JAX-B。它使您的代码更易于管理,并使您免于手动执行序列化和反序列化的hazzard。您可以将所有JAX-B POJO用作参数或返回类型:
@POST
public StatusDTO createStatus(StatusDTO dto) {
//your code here
}
您需要做的就是创建一个POJO并使用@XmlRootElement
对其进行注释,您可以直接将其用作Jersey服务中的参数。
有了这个,您可以返回POJO,JAX-B将进行序列化,因此您也不必手动构建响应。最后,每当您需要返回错误代码时,请尝试抛出WebApplicationException
。
答案 1 :(得分:0)
你需要其他解决方案来使用Java中的json,在Spring中使用Jersey和Jackson,我将json对象捕获到java pojo,请查看此示例https://github.com/ripper2hl/angular-todo/
并且catch对象的代码非常简单
@RequestMapping(method = RequestMethod.POST)
public Todo saveTodo(@RequestBody Todo todo){
return todoDao.save(todo);
}