我正在尝试使用angularjs和spring rest构建一个Web应用程序。对于参考数据(性别,语言,用户类型 - 组合框中的类型),我使用了JPA的单表继承(使用ReferenceData作为基类,使用Language,Gender,UserType作为子类)。
在我的html中,我需要在“创建用户”屏幕中为组合框添加UserType和Gender参考数据。我通过以下方式在angular JS中定义了一个ReferenceDataService:
myapp.factory('ReferenceData', function ($resource) {
return $resource('app/rest/referenceDatas/:id', {}, {
'query': { method: 'GET', isArray: true},
'get': { method: 'GET'},
'genders': {method:'GET', isArray: true, cache:true},
'userTypes': {method:'GET', isArray: true, cache:true},
});
});
在我的angularJs UserServiceController中,我有以下内容:
myApp.config(function ($routeProvider, $httpProvider, $translateProvider, USER_ROLES) {
$routeProvider
.when('/user', {
templateUrl: 'views/users.html',
controller: 'UserController',
resolve:{
resolvedUser: ['User', function (User) {
return User.query().$promise;
}],
resolvedGender: ['ReferenceData', function (ReferenceData) {
return ReferenceData.genders().$promise;
}],
resolvedUserTypes: ['ReferenceData', function (ReferenceData) {
return ReferenceData.userTypes().$promise;
}]
},
access: {
authorizedRoles: [USER_ROLES.all]
}
})
});
以下是我的弹簧控制器的代码片段:
@RequestMapping(value="/rest/referenceDatas/genders",
method=RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public List<? extends ReferenceData> genders(){
return referenceDataRepository.getByType("GENDER");
}
@RequestMapping(value="/rest/referenceDatas/userTypes",
method=RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public List<? extends ReferenceData> userTypes(){
return referenceDataRepository.getByType("USER_TYPE");
}
//DEFAULT getALL
@RequestMapping(value = "/rest/referenceDatas",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public List<ReferenceData> getAll() {
log.debug("REST request to get all ReferenceDatas");
return referenceDataRepository.findAll();
}
我的问题是每次打开创建用户屏幕时,性别和用户类型选择框都填充了Reference_Data表中的所有类型,而日志/调试显示,每当我在referencedata angularjs服务上调用自定义方法语言和userTypes时,都会调用getAll。
非常感谢任何帮助。
答案 0 :(得分:0)
这是因为您在查询时没有传递任何参数。您的ReferenceData
资源具有参数化URL,如果在进行实际HTTP调用时未提供参数值,则会截断该部分(从而截断您的getAll()
调用)。因此,例如,要查询性别,您可以使用:
默认参数
return $resource('app/rest/referenceDatas/:id', {}, {
'query': { method: 'GET', isArray: true},
'get': { method: 'GET'},
'genders': {method:'GET', params: {id:'genders'}, isArray: true, cache:true},
'userTypes': {method:'GET', isArray: true, cache:true},
});
在实际操作调用期间传递参数:
resolvedGender: ['ReferenceData', function (ReferenceData) {
return ReferenceData.genders({id:'genders'}).$promise;
}],