2016-01-04 25 views
0

我用AngularJS來從服務器檢索對象的列表。服務器端正在使用Spring MVC。

所以,我想退回這些對象作爲JSON格式的名單,但是,我想,如果服務器coudn't檢索數據以任何理由返回一個信息性消息的對象。

我可以不用封裝列表<>,並在DTO(數據傳輸對象)的消息對象? 如何檢查AngularJS收到的JSON是否可以來自兩種不同的類型?

這裏是我的控制器類的片段。它目前返回我想要返回的MyType的列表。但想法是將其轉換爲泛型類型(Object,也許?),並根據具體情況從此請求返回列表或消息。

@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

在'then'函數內有條件不會做任何事情,因爲狀態200以外的任何東西都不會觸發第一個'then'函數。它會觸發第二個參數函數或catch()。可以發送具有不同狀態的服務器端錯誤消息,並使用'then'拒絕處理程序來管理響應或發送'errors'屬性並檢查解析處理程序 – charlietfl

+0

除狀態2xx以外的@charlietfl會更準確。 – zeroflagL

+0

@charlietfl,感謝您的提示,但它不認爲問題的核心。 – marionmaiden

回答

1

我不會」 t使用流量控制的例外。如果兩種情況(列表爲空或不是)都是有效的,則在您的處理程序方法中處理它們。使用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。它處理ResponseEntitybody@ReponseBody相同。

因此,一個String將直接寫入響應爲text/plain(或HTML)和List<MyType>將被默認序列化application/json(或任何你已經配置)。

您可以將響應標頭添加到ResponseEntity,這也可以幫助確定如何序列化內容(內容類型等)。

+0

400中的http狀態碼是不成功的請求,所以使用異常返回錯誤碼與使用流控制異常不同。 – DavidA

+0

我對OP問題的解釋是,_empty list_不是一個例外情況(或失敗的情況)。因此,不管狀態碼如何,我都不會使用異常來處理它。 –

+0

這越來越有趣。正如我所看到的,獨立於我使用的解決方案(作爲拋出的異常,或在Controller方法上處理它),主要思想是從服務器檢索HttpStatus,它將指導angularJS服務達到預期結果。我不知道ResponseEntity,它爲HTTP響應提供了更大的靈活性。 – marionmaiden

0

我的建議是拋出一個異常,然後添加在彈簧的異常處理程序,其設置適當的狀態代碼和消息:

@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

+0

不知道爲什麼有人低估了你的問題。我認爲這是一個有趣的選擇,因爲我們可以在客戶端管理響應代碼狀態。在家我會嘗試你的解決方案! – marionmaiden