我正在使用AngularJS从服务器检索对象列表。服务器端是用Spring MVC制作的。
所以,我想以JSON格式返回这些对象的列表,但是,如果服务器因任何原因无法检索数据,我想返回一个信息性消息对象。
我是否可以在不封装List<>的情况下执行此操作和DTO(数据传输对象)中的Message对象? 如果它可以来自两种不同的类型,我如何检查AngularJS收到的JSON?
这是我的控制器类的片段。它目前返回我想要返回的 MyType 列表。但是想法是将它转换为通用类型(对象,可能?)并根据具体情况从该请求返回列表或消息。
@RequestMapping(value = RestPaths.LIST_MYTYPE_BY_OWNER, method = RequestMethod.GET)
public @ResponseBody List<MyType> listByOwner(@RequestBody Owner o) {
List<MyType> myType = myService.list(o);
return myType;
}
这是咨询控制器的服务。考虑到JSON可能有不同的格式,我怎么能处理数据?
this.listMyType = function(ownerId){
var deferred = $q.defer();
$http.get('/rest/my/list_by_owner',{})
.then(function (response) {
if (response.status == 200) {
deferred.resolve(response.data);
}
else {
deferred.reject('Error retrieving list of myType');
}
});
return deferred.promise;
}
答案 0 :(得分:1)
我不会对流量控制使用异常。如果两种情况(列表为空或不是)都有效,请在处理程序方法中处理它们。使用ResponseEntity
封装您的回复。在一个案例(空)中返回String
条消息,在另一个案例中返回List<MyType>
(非空)。
@RequestMapping(value = RestPaths.LIST_MYTYPE_BY_OWNER, method = RequestMethod.GET)
public ResponseEntity<?> listByOwner(@RequestBody Owner o) {
List<MyType> myType = myService.list(o);
if (myType.isEmpty()) {
return new ResponseEntity<>("The message", HttpStatus.NOT_FOUND);
}
return new ResponseEntity<>(myType, HttpStatus.OK);
}
所有处理程序方法返回值都由HandlerMethodReturnValueHandler
个对象处理。 ResponseEntity
的相应内容为HttpEntityMethodProcessor
。它以body
的相同方式处理ResponseEntity
的{{3}}。
因此,String
将直接写入响应text/plain
(或html),List<MyType>
默认会被序列化为application/json
(或者您拥有的任何内容)配置)。
您可以向ResponseEntity
添加响应标头,这也有助于确定内容的序列化方式(内容类型等)。
答案 1 :(得分:0)
我的建议是抛出异常,然后添加一个spring异常处理程序,它设置相应的状态代码和消息:
@RequestMapping(value = RestPaths.LIST_MYTYPE_BY_OWNER, method = RequestMethod.GET)
public @ResponseBody List<MyType> listByOwner(@RequestBody Owner o) {
List<MyType> myType = myService.list(o);
if (myType.size() == 0) {
throw new ResourceNotFoundException("List was empty");
}
return myType;
}
和
@ControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public void handleException(Exception e, HttpServletReponse response) {
response.setStatus(HttpStatus.NOT_FOUND);
response.getOutputStream().write(e.message);
}
}
这是关于spring mvc异常处理的一篇非常好的文章:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc