2017-02-28 9 views
1

私のプロジェクトでバージョン1.4.3でspring-bootを使用しています。このプロジェクトはいくつかのRESTエンドポイントを提供し、springfox-swagger 2.6.1を使用してAPIドキュメントを生成します。 これは私の要求のほとんどすべてに対してうまく動作し、エンドポイントを正常に試すことができます。Swagger UIが原因で、ファイルとjson-objectのspring-resourceからのMultipart-FormDataリクエストが失敗する

しかし、これはMultipartFileとjsonオブジェクトを含むmultipart-formdata要求の処理を停止します。問題は、次の問題のようになります。

JHipster, spring rest service with MultiPart and JSON, swagger/curl error

私はそれがこのように働いてしまったが、私にとっては、それが可能なサイズがありますが原因でリクエストパラメータにJSONオブジェクトを変更するには、有効な解決策ではありません(大きなjsonオブジェクトを試してみると、ヘッダーが大きすぎるというエラーが出てきました)。ここで

は、サンプルコード、およびエラーメッセージです:

エンドポイント:次のように

@RequestMapping(path = "/", produces = { MediaType.APPLICATION_JSON_UTF8_VALUE }, 
    consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }, method = RequestMethod.PUT) 
@ResponseStatus(code = HttpStatus.CREATED) 
public void createApproval(@RequestPart(required = true) @Valid @NotNull @NotBlank MultipartFile file, 
    @RequestPart(required = true) MyClass json, HttpServletRequest request, HttpServletResponse response) 

これが闊歩するAPIを生成します。有効なデータでこれを実行する

parameter - value    - description - parameter type - data type 
file  - (upload file)  - file  - formData  - file 
json  - string-value-filed - json  - formData  - undefined 

は以下を生成し、エラー:

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported 
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:237) 
at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.resolveArgument(RequestPartMethodArgumentResolver.java:127) 
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) 
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:160) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:883) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:651) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:105) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:89) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 
私も、そのためのテストを書いている、これはただの素敵な作品

final MockHttpServletRequestBuilder saveRequestBuilder = MockMvcRequestBuilders.fileUpload(baseUrl).file(mockFile) 
    .file(jsonFile).contentType(contentType); 
saveRequestBuilder.with(new RequestPostProcessor() { 
    @Override 
    public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { 
    request.setMethod("PUT"); 
    return request; 
    } 
}); 
mockMvc.perform(saveRequestBuilder).andExpect(status().isCreated()).andDo(and so on... 

私はまた@ApiImplicitParamといくつかの変更を試してみました。彼らのほとんどは何も変わらなかった。以下の変更を使用して、別のAPIを取得しましたが、エラーが発生した場合、jsonオブジェクトが存在しないことがわかります。

@ApiImplicitParam(name = "json", value = "the json object", required = true, 
    dataType = "MyClass", paramType = "body") 

だから、誰もがこの威張っ-UI-docの中に動作するように取得する方法を知っているのですか?

ご協力いただきありがとうございます。

答えて

0

心配しないで、解決策が見つかりました。それは私の質問で既にリンクしているようです。

json-parameterを単純な文字列に変更し、手動でクラスを手動で変換しても問題ありません。リンクされた質問の解決策もここでもうまくいきます。

だから、短い教訓:

春闊歩-組み合わせは、オブジェクトにJSON-入力を変換するマルチパートリクエストでいくつかの問題を抱えています。回避策は、簡単な文字列を使用し、それを自分で変換することです。私は彼らが将来それを働かせることを願っています。

さらに、リンクされたソリューション:RequestParamである必要はなく、RequestPartもうまく動作します。

関連する問題