如何在同一$ http.get中获取不同的JSON内容

时间:2016-01-04 02:09:55

标签: angularjs json spring-mvc dto

我正在使用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;
}

2 个答案:

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