【问题标题】:how to fix mistake in custom function REST API in AngularJS: Expected response to contain an object but got an array如何修复AngularJS中自定义函数REST API中的错误:预期响应包含一个对象但得到一个数组
【发布时间】:2017-08-17 20:01:53
【问题描述】:

我有一个 RESTful API 。它使我可以访问 MYSQL 数据库,在其中我尝试使用自定义函数 getScholarshipfindByField 获取一些数据,并使用我想使用 AngularJS 构建页面的那些 JSON 数据。 但我收到错误:[$resource:badcfg] 操作getScholarshipfindByField 的资源配置错误。预期响应包含一个对象但得到一个数组(请求:GET `http://localhost:8080/scholarship/webresources/scholarship.scholarship

// 服务

var Services = angular.module('raServices', ['ngResource']);
Services.factory("Scholarship",function($resource){  
return     $resource('http://localhost:8080/scholarship/webresources/scholarship.scholarshi p/level=:level/field=:field/country=:country/language=:language',      {level:'@level',field:'@field',country:'@country',language:'@language'}, {},{
findAll:{method:'GET', isArray:true},
countREST:{method:'GET', isArray:true},
create:{method:'POST'},
edit:{method:'PUT'},
query: {method:'GET',params:  {level:'@level',field:'@field',country:'@country',language:'@language'},isArray: true},
remove:{method:'DELETE'},
find:{method:'GET',params: {id: 'id'},isArray: false},
findRange:{method:'GET'},
getScholarshipfindByField:{method:'GET',params:{level:'@level',field:'@field',country:'@country',language:'@language'},isArray:false,responseType:'json'}

} )
});

// 控制器

 .controller('View2Ctrl',['$scope', 'Scholarship', function($scope, Scholarship) {      
  $scope.data = {};
  $scope.submitForm = function(){
  Scholarship.getScholarshipfindByField(   {'level':$scope.data.level,'field':$scope.data.field,'country':$scope.data.country,'language':$scope.data.language}, function( response ){
  $scope.allscholarship = response;
});
} 

   }]);

//ScholarshipFacadeRest

 @GET
@Path("{level}/{field}/{country}/{language}")
@Produces({ "application/json"}) 
public List<Scholarship> getScholarshipfindByField(@PathParam("level") String level,@PathParam("field") String field,@PathParam("country") String country,@PathParam("language") String language){
        return super.getScholarshipfindByField(level,field,country,language);

}     

// AbstractFacade.java

public List<T> getScholarshipfindByField(Object level,Object field,Object country,Object language) {
  CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
  CriteriaQuery cq = cb.createQuery();
  Root<T> c = cq.from(entityClass);      
  cq.select(c);   
  cq.where(cb.equal(c.get("level"), level),cb.equal(c.get("field"), field),cb.equal(c.get("country"), country),cb.equal(c.get("language"), language));
  return getEntityManager().createQuery(cq).getResultList();

}

//html

    <h3>Choose yours sholarship</h3>
</br></br>
<div ng-app="myApp"   ng-controller="View2Ctrl as data"  >
    <div>         
        <form name="myForm" ng-submit="submitForm()"> 
            <div ng-hide="shows" >
                <div class="form-group">    
                        <label for="level"> Select level of study: </label><br>
                    <select name="level" ng-model="data.level">
                        <option value="All">All</option>
                        <option value="Bachelor">Bachelor</option>
                        <option value="Masters">Master</option>
                        <option value="PhD Degree">PhD Degree</option>
                        <option value="Intership">Intership</option>
                        <option value="Non Degree">Non Degree</option>
                    </select></br></br></br>
                    <tt>{{data.level}}</tt><br/>
                </div>
                <div class="form-group">
                    <label for="field"> Select field of study: </label><br>
                    <select name="field" ng-model="data.field">
                        <option value="All">All</option>
                        <option value="Information Technology">Information Technology</option>
                        <option value="Economics and Finance">Economics and Finance</option>
                        <option value="Business and Management">Business and Management</option>
                        <option value="Engineering">Engineering</option>
                        <option value="Computer Science">Computer Science</option>
                        <option value="Social Sciences">Social Sciences</option>
                        <option value="Physical and Life Sciences">Physical and Life Sciences</option>
                        <option value="Arts">Arts</option>
                        <option value="Humanities">Humanities</option>
                        <option value="Agriculture">Agriculture</option>
                    </select></br></br></br>
                    <tt>{{data.field}}</tt><br/>
                </div>
                <div class="form-group">
                    <label for="country"> Select country of study: </label><br>
                    <select name="country" ng-model="data.country">
                        <option value="All">All</option>
                        <option value="USA">USA</option>
                        <option value="UK">UK</option>
                        <option value="Netherlands">Netherlands</option>
                        <option value="Australia">Australia</option>
                        <option value="Belgium">Belgium</option>
                        <option value="Bulgaria">Bulgaria</option>
                        <option value="Canada">Canada</option>
                        <option value="Czech Republic">Czech Republic</option>
                        <option value="Denmark">Denmark</option>
                        <option value="Finland">Finland</option>
                        <option value="France">France</option>
                        <option value="Germany">Germany</option>
                        <option value="France">France</option>
                        <option value="Greece">Greece</option>
                        <option value="France">France</option>
                        <option value="Italy">Italy</option>
                        <option value="Japan">Japan</option>
                        <option value="Luxembourg">Luxembourg</option>
                        <option value="New Zealand">New Zealand</option>
                        <option value="Norway">Norway</option>
                        <option value="Poland">Poland</option>
                        <option value="Slovakia">Slovakia</option>
                        <option value="Slovenia">Slovenia</option>
                        <option value="Spain">Spain</option>
                        <option value="Sweden">Sweden</option>
                        <option value="Switzerland">Switzerland</option>
                        <option value="Other">Other</option>
                    </select></br></br></br>
                    <tt>{{data.country}}</tt><br/>
                </div>
                <div class="form-group">
                    <label for="language"> Select language of  study: </label><br>
                    <select name="language" ng-model="data.language">
                        <option value="All">All</option>
                        <option value="English">English</option>
                        <option value="German">German</option>
                        <option value="French">French</option>
                    </select></br></br></br>
                    <tt>{{data.language}}</tt><br/>
                </div>
                <button ng-click=" shows = true" type="submit" >Go!</button>
            </div>
        </form>
    </div>
    <div ng-show="shows" >
        <div align="center" div ng-app="myApp" ng-controller="View2Ctrl"> 
            <div class="container"> 
                <div >
                    <table class="table-condensed">
                        <thead>
                            <tr>
                                <th>id</th>
                                <th>level</th>
                                <th>field</th>
                                <th>country</th>
                                <th>language</th>
                                <th>university</th>
                                <th>link</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr ng-repeat="onescholarship in allscholarship">
                                <td>{{ onescholarship.id}}</td>
                                <td>{{ onescholarship.level}}</td>
                                <td>{{ onescholarship.field}}</td>
                                <td>{{ onescholarship.country}}</td>
                                <td>{{ onescholarship.language}}</td>
                                <td>{{ onescholarship.university}}</td>
                                <td>{{ onescholarship.link}}</td>
                            </tr>
                        </tbody>
                    </table> 
                </div>
            </div> 
        </div>
        <button ng-click="shows = false">New search</button>  
    </div>
</div>

如何修复错误?

【问题讨论】:

    标签: angularjs rest


    【解决方案1】:

    您已将 isArray 设置为 false 在此行中的该调用

    getScholarshipfindByField:{method:'GET',params:{level:'@level',field:'@field',country:'@country',language:'@language'},isArray:false,responseType:'json'}
    

    只需将其更改为 true 即可。

    【讨论】:

    • 将 isArray 更改为 true 后,错误保持不变
    • 好的,我又看了一遍,它看起来仍然是解决方案。你确定你已经完全刷新了你的页面吗?清除缓存。
    • 完全刷新后错误仍然存​​在:错误:[$resource:badcfg] 操作getScholarshipfindByField 的资源配置错误。预期响应包含一个对象但得到一个数组(请求:GET localhost:8080/scholarship/webresources/scholarship.scholarshiperrors.angularjs.org/1.4.7/$resource/…...%2Flocalhost%3A8080%2Fscholarship%2Fwebresources%2Fscholarship.scholarship
    • 在 angular.js:68 at $http.then.value.$resolved (angular-resource.js:594) at processQueue (angular.js:14745) at angular.js:14761 at Scope .$eval (angular.js:15989) at Scope.$digest (angular.js:15800) at Scope.$apply (angular.js:16097) at done (angular.js:10546) at completeRequest (angular.js: 10744) 在 XMLHttpRequest.requestLoaded (angular.js:10685)
    • 好吧,我需要一个 plunkr 来解决错误发生的地方,如果你这样做,我会看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2015-03-11
    相关资源
    最近更新 更多