Как разместить массив объектов Json в AngularJS (используя $resource save или через службу $http) и Как использовать его в Resteasy
На первом шаге я успешно сохранил одного пользователя с помощью $resource save в angularjs, переданном в службу Resteasy, и все работает хорошо.
На втором шаге, который я сейчас пытаюсь сделать, я хочу опубликовать JSON массива пользователей (и сохранить в onego через angularjs $resource сохранить этот массив объектов) для потребителя 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"
}
]
Backend
Для достижения моей цели я использую несколько изменений в моем предыдущем рабочем бэкэнде, в частности в 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, добавив save: 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 save в WebService (часть кода, которая прокомментирована ниже в листинге).
2-Моя вторая попытка была опубликовать через $http на веб-сервис (см. Ниже в листинге).
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), function (success), это не работает.
с другой стороны, во второй попытке я также попытался использовать службу $http, как вы можете видеть, но также и безрезультатно.
Вопрос о бэкэнде:
Какой правильный синтаксис для службы RestEasy для использования этого массива пользователей json? Я имею в виду: в режиме public public Response create(конечные пользователи [] пользователей) - (конечные пользователи [] пользователей), поскольку подпись будет принята, или я должен использовать другие обходные пути, например, URI или String AnArray, и проанализировать String, как здесь:
public create (String AnArray) {
JSONArray o = new JSONArray(AnArray);
System.out.println(o.toString());
return responseBuilder.build();
}
с другой стороны на переднем конце:
-Какой правильный синтаксис в angularjs UserService для достижения успешного использования сохранения из службы ресурсов angularJS $ в этом случае, когда передается массив объектов?
это строка JSON.stringify мой список это правильно
За $ressource.save
UserService.save(JSON.stringify(list), function (success) {
ИЛИ ЖЕ
За $http сервис
var liststringifyed=JSON.stringify(list);
$http.post("rest/users",{users:liststringifyed}){
NB: если мы не можем использовать save from $resource для этого случая, как добиться этого с помощью сервиса $http?
Большое спасибо за вашу помощь.
1 ответ
Следите за поздним ответом, но он может быть полезен для других, проверьте и убедитесь, что вы опубликовали что-то вроде этого:
[
{
"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'. вы не публикуете массив
Так что в моем случае я отправлял объект с единственным именованным свойством, и когда вы получаете это на бэкэнде, попробуйте удалить последние два символа и подстроку, совпадающую с {"users": еще одна вещь на бэкэнде - строка параметров - это jsonstring, так что вы необходимо удалить все обратные слешы, чтобы получить действительный JSON.
поэтому, чтобы ответить на это, вы должны добавить
зависимости от Maven
<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);
});