2015-09-02 41 views
0

我有一個java web服務,用於驗證唯一字段。 它接收一個字符串並在數據庫中搜索其中一個字段中已經具有該值的實體。 java的春天端點

@RequestMapping(value = "/value", method = RequestMethod.POST) 
@ResponseCaching(mode = Mode.NEVER) 
@ResponseBody 
public Keuze findByValue(@RequestBody final String value) { 
    return getService().findByvalue(value); 
} 

角$資源對象是:

var resource = $resource('service/:entity/:field', {}, { 
    uniqueValue: { 
     method: 'POST', 
     url: 'service/:entity/:field', 
     cache: false 
    } 
}); 

在做驗證的驗證服務的功能:

function uniqueValue(entity, field, value) { 
    return resource.uniqueValue({entity:entity,field:field}, angular.toJson(value)).$promise; 
} 

我調用該函數的指令,如下所示:

validationService.uniqueValue('keuzes', 'omschrijving', viewValue).then(function(keuze) { 
    ctrl.$setValidity('unique', !keuze || keuze.id == scope.keuze.id); 
}); 

我遇到的問題是,當該webservice本身返回null時,角度資源似乎返回發送到webservice的對象。只有當webservice返回一個對象才能正常工作。假設用戶輸入值「測試」,那麼似乎在web服務已返回以下指令:

{ 
    0: """, 
    1: "t", 
    2: "e", 
    3: "s", 
    4: "t", 
    5: """ 
} 

檢查Chrome開發者工具,清楚地表明,Web服務做了正確的工作和返回任何內容。

我以前實現這與角$ http,並且工作正常。這是角度$資源有意的這種行爲,我錯過了什麼,或者這是一個錯誤?我找不到任何其他地方的這種行爲的參考,這讓我覺得我做錯了什麼。

PS:我現在使用的角度爲1.3.2。

回答

0

根據文檔,您似乎有意在成功處理程序中獲取資源: 成功時,承諾將使用相同的資源實例或集合對象進行解析,並使用來自服務器的數據進行更新。這使得在$ routeProvider.when()的resolve部分中使用它很容易,以便延遲查看渲染,直到加載資源。

+0

當我用'包裝'函數替換angular.toJson(value)時,角度$ resource嘗試發送請求到/ service端點。它似乎完全忽略了url中的佔位符。 –

+0

我編輯了我的答案 - 這是廢話:-) – Rob

+0

我試圖發送它沒有序列化。我的Spring後端正期待json,所以發送一個沒有序列化的字符串會導致錯誤。你發佈的信息確實解釋了$資源的角度是如何工作的。我猜如果沒有來自服務器的數據,angular就不能'更新'該對象,而只是返回原始對象。有意或無意,這會導致非常奇怪的行爲。我目前通過檢查返回的對象是否具有id字段來修復它。如果它不知道,驗證已通過。它的工作原理,但感覺很不舒服。 –