2016-04-29 12 views
0

Ich habe eine AngularJS-Front-End einen App-Service aufrufen, die nur einige Dummy-Daten zurückgibt.Fehlermeldung in AnglarJS (und Spring ResponseEntity)

Die Anwendung schlägt bei diesem Aufruf zeitweise fehl, und ich kann nicht herausfinden, warum. Ich habe im Spring-REST-Dienst "Logging" (Konsolen), was zeigt, dass es hier kein Problem gibt. Ich habe es ein bisschen verändert, um so viel wie möglich hier zu überprüfen. Es kehrt ein org.springframework.http.ResponseEntity Objekt

//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; 

} 

Dies funktioniert ohne Frage jedes Mal! Erfolg oder scheitern die letzte Ausgabe vor der Rückkehr ist erfolgreich und die neue ID. Auch das Erschaffen speichert im Speicher (Tomcat) und wenn ich mich aktualisiere und zu einer Listenseite zurückgehe, wurde die Person erstellt.

Ich habe Probleme in der AngularJS obwohl. Die Art und Weise, in der der AngularJS-Dienst den Rückkehrcode empfängt, ist unterbrochen. Ich habe es immer wieder angeschaut und verschiedene Dinge ausprobiert, aber ich komme nicht auf den Grund. Dies ist wahrscheinlich nicht genug Info unten, wenn Sie bereit sind zu helfen, lassen Sie mich wissen, was Sie sonst noch brauchen.

Ich begann mit

//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; 
     }) 
    }; 

Dieser Code oft ignoriert wird. Ich änderte .success zu verwenden und .error denken dies der Weg war aber @Duncan sagt mir, ich habe diese falsch herum (Danke für die Info!)

Ich schließe dies hier allerdings, da es ein interessantes Ergebnis erzeugt

//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); 
      }); 
    }; 

Das Ergebnis davon war, dass der Status immer -1 ist. Als ich den Beitrag zu einem Put

änderte und ich bekam einen 405 Fehler (wie es nicht existiert). Das lässt mich fragen, ob der AngularJS-Dienst und die Spring ResponseEntity-Objekte nicht kommunizieren?

Ich fragte mich, ob das der Fall sein könnte (das ist der Grund, warum ich Spring zu den Tags hinzugefügt habe), denke ich, dass ich alles richtig mache, obwohl? Ich schätze, meine Frage ist sehr einfach, hoffe ich - kann mir jemand sagen, wie ich gute Informationen über den Fehler bekommen kann? Wenn ich das .then() verwende bekomme ich keine Informationen darüber, warum es überhaupt versagt ?!

Für diese Vollständigkeit der AngularJS Controller ...

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

Antwort

2

$http.success Versprechen gibt data, status, headers, config. In dieser Reihenfolge. Ich weiß nicht, wo Sie http, status, fnc, httpObj von bekommen. Aber Sie sollten nicht .success oder .error verwenden; Verwenden Sie stattdessen .then. Es ist also wie folgt aus:

$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 
}); 

Was sollten Sie wirklich tun in Ihrem api ist, sollten Sie einen try/catch hinzufügen, wo Sie denken, der Dienst versagt. Ich weiß Java nicht viel ... Aber das ist, wie Sie es in C# tun würden:

+1

Sie und die OP beide haben es rückwärts. '.success' übergibt diese Parameter, ist jedoch veraltet und sollte nicht verwendet werden. '.then 'übergibt einfach einen einzelnen' response' Parameter an den Callback. – Duncan

+0

@Duncan Danke. Bearbeitet. – Kyle

+0

Danke für Ihre Hilfe beides. Ich habe die Frage komplett überarbeitet. Ich habe mich gefragt, @ Duncan, wenn Sie mir sagen könnten, wie ich Fehler finden kann, wenn ich .then() verwende? Ich denke, der nächste Schritt besteht darin, ein anderes Rückgabeobjekt zu verwenden. – gringogordo