Как опубликовать массив объектов Json в AngularJS (используя сохранение $resource или через службу $http) и как использовать его в Resteasy

На первом этапе мне удалось успешно сохранить одного пользователя с помощью $resource save в angularjs, переданном службе Resteasy, и все работает хорошо.

На втором этапе то, что я пытаюсь сделать сейчас, это то, что я хочу опубликовать JSON массива пользователей (и сохранить в onego через angularjs $resource, сохранить этот массив объектов) в потребительский Restful WebService (я использую Resteasy).

мой json сейчас выглядит так (массив пользователей):

 [
        {
            "userid": 1,
            "firstName": "kevin",
            "lastName": "buruk",
            "email": "[email protected]"
        },
        {
            "userid": 2,
            "firstName": "helm",
            "lastName": "krpuk",
            "email": "[email protected]"
        },
        {
            "userid": 3,
            "firstName": "batok",
            "lastName": "kelapa",
            "email": "[email protected]"
        }
    ]

Бэкенд

Для достижения своей цели я вношу несколько изменений в свой предыдущий рабочий бэкэнд, особенно в UserClientServiceImpl, например:

  • 1- Путем изменения подписи метода создания (см. код ниже) с окончательной подписи пользователя на окончательную подпись пользователя [] пользователей, чтобы обрабатывать массив пользователей вместо одного пользователя.

  • 2- и прибавив петлю ЗА. запросить уже хорошо подтвержденную
    работу create userService

    @Путь("/пользователи")

    открытый класс 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 сохранение в WebService (часть кода, которая прокомментирована в листинге ниже). 2. Моя вторая попытка заключалась в публикации через $http в WebService (см. ниже в листинге).

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 (список), функция (успех), она не работает.

с другой стороны, во второй попытке я также попытался использовать службу $http, как вы можете видеть, но тоже безрезультатно.

Вопрос по бэкенду:

Каков правильный синтаксис службы RestEasy для использования этого массива пользователей json? Я имею в виду: общедоступный ответ на линии create(final User[] users) is (final User[] users), поскольку подпись будет принята, или мне следует использовать другие обходные пути, например URI или String AnArray, и проанализировать эту строку, как здесь:

public  create (String AnArray) {
           JSONArray o = new JSONArray(AnArray);

                System.out.println(o.toString());

                return responseBuilder.build();
}

с другой стороны на фронтенде:

-Каков правильный синтаксис в UserService angularjs для успешного использования службы сохранения из angularJS $resource в этом случае, когда передается массив объектов?

это строка JSON.stringify мой список это правильно

Для $ressource.save

UserService.save(JSON.stringify(list), function (success) {

OR

Для сервиса $http

var liststringifyed=JSON.stringify(list);
$http.post("rest/users",{users:liststringifyed}){

NB: если мы не можем использовать сохранение из $resource для этого случая, как добиться этого с помощью службы $http?

Большое спасибо за вашу помощь.


person Schwertfisch    schedule 04.10.2018    source источник


Ответы (1)


Следите за поздним ответом, но он может быть полезен для других, проверьте и убедитесь, что вы публикуете что-то вроде этого:

[
        {
            "userid": 1,
            "firstName": "kevin",
            "lastName": "buruk",
            "email": "[email protected]"
        },
        {
            "userid": 2,
            "firstName": "helm",
            "lastName": "krpuk",
            "email": "[email protected]"
        },
        {
            "userid": 3,
            "firstName": "batok",
            "lastName": "kelapa",
            "email": "[email protected]"
        }
]

а не как следующее Потому что, отправив или опубликовав это:

{"users":[
        {
            "userid": 1,
            "firstName": "kevin",
            "lastName": "buruk",
            "email": "[email protected]"
        },
        {
            "userid": 2,
            "firstName": "helm",
            "lastName": "krpuk",
            "email": "[email protected]"
        },
        {
            "userid": 3,
            "firstName": "batok",
            "lastName": "kelapa",
            "email": "[email protected]"
        }
    ]
"}

вы публикуете объект с одним именованным свойством «пользователи». вы не публикуете массив

Итак, в моем случае я отправлял объект с одним именованным свойством, и когда вы получаете это на бэкэнде, попробуйте удалить последние два символа и подстроку, соответствующую {"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);

                    });
person Schwertfisch    schedule 06.10.2018