2016-06-02 11 views
3

私は、角度のあるUIから春のブートRESTサービスを呼び出しています。 Spring Boot RestサービスがSpring起動アプリケーションとして実行されていれば、それはうまくいった。しかし、それをWARファイルに変換してJboss 6.2.4サーバーにデプロイすると、私は404を取得しています。UIからのRESTサービスコールは成功しましたが、リクエストJSONは渡されません。リクエストでJSON私は2つの文字列とアップロードされたExcelファイルを渡しています。角度のあるhttpと春のブートレストサービス

これは私の角度UIのHTTP呼び出しです

App.service('getHeatMapDataService', ['$http', '$q', function ($http,  $q) { 
this.getHeatMapData = function (scope) { 
    var url = 'http://localhost:8080/rest-services/fusiontables/upload'; 
    var deferred = $q.defer(); 
    $http({ 
      method: 'POST', 
      url: url, 
      headers: { 
       'Content-Type': undefined 
      }, 
      data: { 
       stateCd: scope.stateCd, 
       addressExtras: scope.addressExtras, 
       uploadFile: scope.upFile 
      }, 
      transformRequest: function (data, headersGetter) { 
       var formData = new FormData(); 
       angular.forEach(data, function (value, key) { 
        formData.append(key, value); 
       }); 

       var headers = headersGetter(); 
       delete headers['Content-Type']; 
       return formData; 
      } 
     }) 
     .success(function (data) { 
      deferred.resolve(data); 
      console.log("Success"); 
      console.log(data); 
     }) 
     .error(function (data, status) { 
      deferred.reject(status); 
      console.log("Failed"); 
     }); 
    return deferred.promise; 
} 
}]); 

これは、これが私の後私のuploadコマンド

public class HeatMapUploadCommand { 

private String stateCd; 
private String addressExtras; 
private MultipartFile uploadFile; 

ある

@RequestMapping(value="/upload", method=RequestMethod.POST) 
@ResponseBody 
public String getBoundaries(HeatMapUploadCommand uploadCommand) { 
    logger.info("Heat Map Controller invoked " + uploadCommand); 
    return null; 
} 

を働いていた私の春のブート残りコントローラですJbossにデプロイされた依頼は依然としてSpring Bootアプリケーションにヒットしますが、リクエストパラメータはすべてnullになります。

これは私はまだ

@RequestMapping(value="/upload", method=RequestMethod.POST) 
@ResponseBody 
public String getBoundaries(@RequestParam(value="stateCd") String stateCd, 
     @RequestParam(value="addressExtras") String addressExtras, 
     @RequestParam(value="uploadFile") MultipartFile file) { 
    System.out.println("Heat Map Controller invoked " + stateCd); 
    return null; 
} 

運としてコントローラを変更しようとした要求ペイロード

------WebKitFormBoundaryvCCnl3nhIgoW1MwR 
Content-Disposition: form-data; name="stateCd" 

CA 
------WebKitFormBoundaryvCCnl3nhIgoW1MwR 
Content-Disposition: form-data; name="addressExtras" 

1234 
------WebKitFormBoundaryvCCnl3nhIgoW1MwR 
Content-Disposition: form-data; name="uploadFile"; filename="CAdata.xlsx" 
Content-Type: application/vnd.openxmlformats- officedocument.spreadsheetml.sheet 


------WebKitFormBoundaryvCCnl3nhIgoW1MwR-- 

あります。これが私の反応です。

{"timestamp":1464840821648,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.MissingServletRequestParameterException","message":"Required String parameter 'stateCd' is not  present","path":"/rest-services/fusiontables/upload"} 

答えて

0

は、最後にそれを考え出しました。

私はMultipartresolver beanを追加する必要がありました。問題を修正

@Configuration 
public class WebConfig extends WebMvcAutoConfiguration { 
@Bean 
public MultipartResolver multipartResolver() { 
    return new CommonsMultipartResolver(); 
} 

}

。私は春のブートアプリケーションとして実行するときのように見えますが、春はすでに処理されますが、WARファイルとしてデプロイすると、このBeanを設定する必要があります

3

あなたは@RequestBodyが見つかりませんでした。

データプロパティで$httpを使用すると、データはrequest bodyに渡されます。

$http({ 
    method: 'POST', 
    url: url, 
    data: { 
     stateCd: scope.stateCd, 
     addressExtras: scope.addressExtras, 
     uploadFile: scope.upFile 
    }, 

私はあなたが@RequestBodyを追加したら、それは作業することができると思います。

@RequestMapping(value="/upload", method=RequestMethod.POST) 
@ResponseBody 
public String getBoundaries(@RequestBody HeatMapUploadCommand uploadCommand) { 
    logger.info("Heat Map Controller invoked " + uploadCommand); 
    return null; 
} 
+0

HTTPステータス415サポートされていないメディアタイプが表示されます。 {"timestamp":1464874683832、 "status":415、 "error": "サポートされていないメディアタイプ"、 "例外": "org.springframework.web.HttpMediaTypeNotSupportedException"、 "message": "コンテンツタイプ 'multipart/form-data ;境界= ---- WebKitFormBoundarymRKqwcUfa6CJzALs; charset = UTF-8 'サポートされていません "、"パス ":"/rest-services/fusiontables/upload "} –

0

あなたは、この春のコントローラメソッドを試すことができます:

@RequestMapping(value="/upload", method=RequestMethod.POST) 
@ResponseBody 
public String getBoundaries(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException { 
    String stateCd = request.getParameter("stateCd"); 
    String addressExtras = request.getParameter("addressExtras"); 
    ...... 
    Iterator<String> iterator = request.getFileNames(); 
    while (iterator.hasNext()) { 
      MultipartFile multipartFile = request.getFile(iterator.next()); 
      ..... 
    } 
    ......... 
} 

と角度のサービス:

App.service('getHeatMapDataService', ['$http', '$q', function ($http,$q) { 
    this.getHeatMapData = function (scope) { 
    var url = 'http://localhost:8080/rest-services/fusiontables/upload'; 
    var deferred = $q.defer(); 
    var formData = new FormData(); 
    formData.append('stateCd', scope.stateCd); 
    formData.append('addressExtras', scope.stateCd); 
    formData.append('file', scope.upFile); 

    $http.post(url, formData, { 
     headers: { 'Content-Type': undefined }, 
     transformRequest: angular.identity 
    }).success(function (result) { 
     console.log('200'); 
    }).error(function() { 
     console.log('400-500'); 
    }); 
    return deferred.promise; 
    } 
}]); 
+0

これもうまくいきませんでした。私はまだすべてのフィールドでnullsを得ています。 –

+0

どのフィールドがヌルになっていますか?要求ペイロードでは何が表示されますか? –

+0

私はmod angularサービスで答えを更新しました。 –

関連する問題