angularjs $ resource custom get action始终使用spring rest controller调用默认的getAll方法

时间:2014-12-19 07:09:43

标签: angularjs spring rest spring-mvc jpa

我正在尝试使用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。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是因为您在查询时没有传递任何参数。您的ReferenceData资源具有参数化URL,如果在进行实际HTTP调用时未提供参数值,则会截断该部分(从而截断您的getAll()调用)。因此,例如,要查询性别,您可以使用:

  1. 默认参数

     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},
    });
    
  2. 在实际操作调用期间传递参数:

    resolvedGender: ['ReferenceData', function (ReferenceData) {
        return ReferenceData.genders({id:'genders'}).$promise;
    }],