AngularJS(和Spring ResponseEntity)中的错误报告

时间:2016-04-29 15:56:53

标签: angularjs spring-restcontroller

我有一个AngularJS前端调用app-service,只返回一些虚拟数据。

应用程序间歇性地在此调用失败,我无法解决原因。我在Spring REST服务中“登录”(到控制台),这表明这里没有问题。我已经改变了一点,以尽可能多地检查。它返回一个org.springframework.http.ResponseEntity对象

//Service controller
 @RequestMapping(value = "/person", method = RequestMethod.POST)
public ResponseEntity<Long> createPerson(@RequestBody Person person) {

    System.out.println("Service Layer - Creating Person");

    Long newPersonId = personService.createPerson(person);
    System.out.println("Created new Person: " + Long.toString(newPersonId));

    ResponseEntity<Long> x = new ResponseEntity<Long> (newQuestionId, HttpStatus.OK);

    System.out.println("return code: " + x.getStatusCode().toString());

    return x;

}

每次都没有问题!在返回成功和新Id之前成功或失败最后一个输出。此外,创建将保存到内存(Tomcat),当我刷新并返回列表页面时,已创建Person。

我在AngularJS中遇到了问题。 AngularJS服务接收返回代码的方式存在间歇性。我一遍又一遍地看着它,尝试了各种不同的东西,但我无法深究它。这可能不是下面的信息,所以如果你愿意帮我们告诉我你还需要什么。

我从

开始
//Post Question
factory.createQuestion = function (question) {
    return $http.post(serviceBase + 'question/' , question).then(
      function (response) {
        alert ("X1");
        alert ("X3: " + response.status);
        newQuestionId = response.data;
        return response.data;
         })
    };

此代码经常被忽略。我改为使用.success和.error认为这是方式,但@Duncan告诉我,我有错误的方法(感谢信息!)

我在这里包含了这个,因为它产生了一个有趣的结果

//JS Service
factory.createPerson = function (person) {
        return $http.post('serviceurl/person' , person).success
        (
            function (response) {
                newPersonId = response.data;
                return response.data;
        }).error(function(http, status) {
                alert ('error');
                alert ('status:' + status);
            });
    };

结果是状态始终为-1。当我将帖子更改为put

$http.post('serviceurl/person'...

我得到了405错误(因为它不存在)。这让我想知道AngularJS服务和Spring ResponseEntity对象是否没有通信?

我想知道是否会出现这种情况(这就是我将Spring添加到标签中的原因),我认为我现在正在做的一切正常吗?我想尽管我的问题非常基本但我希望 - 有人能告诉我如何获得有关错误的良好信息。如果我使用.then(),我得不到它为什么会失败的信息?!

为了完整性,这是AngularJS控制器...

//JS Controller 
$scope.submitPersonData = function () {
    personService.createPerson($scope.person)
    .then(function (newPersonId) {
        $location.path('/people');  
    });
};    

1 个答案:

答案 0 :(得分:2)

$http .success承诺返回data, status, headers, config。以该顺序。我不知道你从哪里获得http, status, fnc, httpObj。但是你不应该使用.success.error;请改用.then。所以它是这样的:

$http.post('/path/to/api', person).then(function(response) {
    //http 200 resolved
    //get http status from response.status
    //get data from response.data
}, function(response) {
    //an error has occurred.  get details from data
    //get http status from response.status
    //get data from response.data
});

你真正应该做的是在api中,你应该在你认为服务失败的地方添加一个try / catch。我不太了解java ...但这就是你在C#中的表现:

[HttpPost]
public JsonResult CreatePerson(Person person)
{
    PersonService service = new PersonService(person);

    Dictionary<string, object> returnMessage = new Dictionary<string, object>();

    try
    {
        long newPersonId = service.CreatePerson();
        returnMessage.Add("message", "success");
        returnMessage.AdD("newPersonId", newPersonId);
    }
    catch (Exception exc)
    {
        returnMessage.Add("message", "error");
        returnMessage.Add("details", exc.Message);
    }

    return Json(returnMessage);
}