2015-09-02 83 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字段来修复它。如果它不知道,验证已通过。它的工作原理,但感觉很不舒服。 –