第一步,我成功地通过$ resource保存了单个用户,并保存到了传递给Resteasy服务的angularjs中,并且eveything效果很好。
第二步,我现在想在这里执行的操作是,将用户数组的JSON(并通过angularjs $ resource保存在onego中,保存该对象数组)发送给消费者Restful WebService(我使用Resteasy)。
我的json现在(用户数组)如下所示:
[
{
"userid": 1,
"firstName": "kevin",
"lastName": "buruk",
"email": "pucuk@ubi.com"
},
{
"userid": 2,
"firstName": "helm",
"lastName": "krpuk",
"email": "helmkrupuk@gmail.com"
},
{
"userid": 3,
"firstName": "batok",
"lastName": "kelapa",
"email": "batokkelapa@gmail.com"
}
]
为了实现我的目标,我在以前的工作后端上对UserClientServiceImpl进行了一些更改,例如:
1-通过从以下位置更改create方法的签名(请参见下面的代码) 将最终用户用户签名复制到最终用户[]用户签名上,以 处理用户数组,而不是单个用户。
2-并添加循环FOR。要求已经确认的
正在创建userService
@Path(“ /用户”)
公共类UserClientServiceImpl实现UserClientService {
@POST
@Consumes(RestCookieBuilder.JSON_UTF8)
@Produces(RestCookieBuilder.JSON_UTF8)
@Override
public Response create(final User[] users) {<---------Is Signature here is ok?
Response.ResponseBuilder responseBuilder = Response.ok();
for(User user : users) {
try {
userService.create(user);
}
catch(Exception e) {
responseBuilder = Response.status(Response.Status.EXPECTATION_FAILED).entity("{\"error\":\""
+ "canceled user :("
+ e.getMessage() + ")\"}");
}
}
return responseBuilder.build();
}
}
并通过添加保存更改了我的UserService在angularjs中:isArray:true 因为我们现在不再与单个用户合作,而是 与一系列用户合作。
在AngularJS中,我在此服务上编写了以下代码
(function () {
'use strict';
angular.module('app').factory('UserService', function ($resource){
return $resource('rest/users/', [],
{
delete: {method: 'DELETE', url: 'rest/users/:id'},
save: {method: 'POST',url: 'rest/users',isArray: true},
findAll: {method: 'GET', url: 'rest/users'},
});
});
})();
在AngularJS中,我还对以下控制器代码进行了一些更改,以通过$ ressource发布到WebService。
这一次在控制器中,我创建了一个用户列表
然后尝试了2件事:
1-我的第一次尝试是通过$ ressource将内容保存到WebService中(代码部分
在下面的清单中进行了注释)。
2-我的第二次尝试是通过$ http发布到WebService(请参见清单3)。
var list = [];
for(i = 0; i < users.length; i++) {
var user={};
user=users[i]['value'];
list.push(user);
}
/*UserService.save(JSON.stringify(list), function (success) {
$element.modal('hide');
close({type: 'success', msg: 'Users created successfully'}, 500);
}, function (error) {
alert(" Errorrs for users !!!!!! "+i);
createErrorAlert(error);
});*/
var liststringifyed=JSON.stringify(list);
$http.post("rest/users",{users:liststringifyed})
.success(function (data, status, headers) {
$scope.ServerResponse = data;
$element.modal('hide');
close({type: 'success', msg: 'Users created successfully'}, 500);
})
.error(function (data, status, header, config) {
$scope.ServerResponse = data ;
alert(" Errorrs for users !!!!!! "+i);
});
};
您可以看到我的第一次尝试,看到了代码中的注释部分,即UserService.save(JSON.stringify(list),函数(成功)它不起作用。
另一方面,在第二次尝试中,我也尝试使用$ http服务,如您所见,但也没有结果。
有关后端的问题:
RestEasy服务使用该json用户数组的正确语法是什么? 我的意思是:在线公开响应create(final User [] users)是(final User [] users),因为签名会被接受或我应该使用其他 解决方法,例如URI或String AnArray,然后按如下所示解析该String:
public create (String AnArray) {
JSONArray o = new JSONArray(AnArray);
System.out.println(o.toString());
return responseBuilder.build();
}
-在通过对象数组的情况下,UserService angularjs在成功使用angularJS $资源服务中的保存时要实现的正确语法是什么?
是JSON.stringify行,我的列表是正确的事情
UserService.save(JSON.stringify(list), function (success) {
OR
var liststringifyed=JSON.stringify(list);
$http.post("rest/users",{users:liststringifyed}){
N.B:如果无法在这种情况下使用$ resource中的save 如何使用$ http服务实现这一目标?
非常感谢您的帮助。
答案 0 :(得分:0)
注意较晚的答案,但可能对其他人有帮助,请验证并检查您是否发布了这样的内容:
[
{
"userid": 1,
"firstName": "kevin",
"lastName": "buruk",
"email": "pucuk@ubi.com"
},
{
"userid": 2,
"firstName": "helm",
"lastName": "krpuk",
"email": "helmkrupuk@gmail.com"
},
{
"userid": 3,
"firstName": "batok",
"lastName": "kelapa",
"email": "batokkelapa@gmail.com"
}
]
并且不喜欢以下内容,因为通过发送或发布此内容:
{"users":[
{
"userid": 1,
"firstName": "kevin",
"lastName": "buruk",
"email": "pucuk@ubi.com"
},
{
"userid": 2,
"firstName": "helm",
"lastName": "krpuk",
"email": "helmkrupuk@gmail.com"
},
{
"userid": 3,
"firstName": "batok",
"lastName": "kelapa",
"email": "batokkelapa@gmail.com"
}
]
"}
您正在发布具有单个“用户”命名属性的对象。您没有发布数组
所以我的情况是我发送了一个具有单个命名属性的对象,当您在后端收到此对象时,请尝试删除两个字符和匹配{“ users”的子字符串: 后端的另一件事是您的参数字符串是jsonstring,因此您必须删除所有反斜杠以获取有效的json。
要回答这个问题,您必须添加
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.1</version>
</dependency>
添加到
======
import org.json.JSONArray;
import org.json.JSONObject;
import com.google.gson.Gson;
@POST
@Consumes(RestCookieBuilder.JSON_UTF8)
@Produces(RestCookieBuilder.JSON_UTF8)
@Override
public Response create(String AnArray) {
String string2 = "{\"users\":\"";
int index = AnArray.indexOf("{\"users\":\"");
if(index == -1) {
// Not found. What do you want to do?
}
else {
String result = AnArray.substring(0, index) + AnArray.substring(index + string2.length());
result = result.substring(0, result.length() - 2);
String jsonFormattedString = result.replaceAll("\\\\", "");
AnArray = jsonFormattedString.trim();
}
Response.ResponseBuilder responseBuilder = Response.ok();
try {
String passedObj = AnArray.trim();
JSONArray array = new JSONArray(passedObj);
User[] users = new User[array.length()];
for(int i = 0; i < array.length(); i++) {
JSONObject jsonObject = (JSONObject) array.get(i);
Gson gson = new Gson();
Object object = gson.fromJson(jsonObject.toString(), User.class);
users[i] = (User) object;
}
for(User user : users) {
try {
userService.create(user);
}
catch(UserException e) {
responseBuilder = Response.status(Response.Status.PRECONDITION_FAILED).entity("{\"error\":\""
+ "Users not created: ("
+ e.getMessage() + ")\"}");
}
}
}
catch(Exception e) {
e.getMessage();
}
return responseBuilder.build();
}
在前端AngularJS上
=======================
$http.post("rest/users",{users:liststringifyed})
.success(function (data, status, headers) {
$scope.ServerResponse = data;
$element.modal('hide');
close({type: 'success', msg: 'users created in onego'}, 500);
})
.error(function (data, status, header, config) {
$scope.ServerResponse = data ;
alert(" Errorrs !!!!!! "+i);
// createErrorAlert($scope.ServerResponse);
});