如何在AngularJS中发布Json对象数组(使用$ resource save或通过$ http服务),以及如何在Resteasy中使用它

时间:2018-10-04 23:46:13

标签: angularjs jax-rs resteasy angularjs-resource

第一步,我成功地通过$ 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行,我的列表是正确的事情

对于$ ressource.save

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

OR

对于$ http服务

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

N.B:如果无法在这种情况下使用$ resource中的save      如何使用$ http服务实现这一目标?

非常感谢您的帮助。

1 个答案:

答案 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。

要回答这个问题,您必须添加

对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);

                    });