1

当我尝试使用 swagger 和 jersey 来解释响应时,生成的 rest 客户端包含:

应用程序/xml;字符集=utf-8

我得到以下异常:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/xml;charset=utf-8, type=class com.company.rest.client.model.generated.Result, genericType=class com.company.rest.client.model.generated.Result. at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:232)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:834)
    at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:363)
    at org.glassfish.jersey.client.InboundJaxrsResponse$2.call(InboundJaxrsResponse.java:126)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:389)
    at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:264)

我尝试了在 swagger yaml 中定义消费的不同方法,例如:

  • 应用程序/xml
  • 应用程序/xml;字符集=utf-8
  • 应用程序/xml;charset=utf-8
  • 应用程序/xml,字符集=utf-8

...

大摇大摆的yaml:

swagger: '2.0'
info:
  description: REST API
  version: '1.0'
  title: REST API
  contact:
    email: support@company.com

host: setinproperties
basePath: /api/v1
schemes:
 - https
consumes:
  - application/xml;charset=UTF-8
produces:
  - application/xml

definitions:
  Result:
     type: object
     required:
       - DateTime  
       - Key
       - Value   
     properties:
      DateTime:
        type: string
        format: date-time
      Key:
        type: string
      Value:
        type: string

paths:
  '/result':
    get:
      summary: getResult
      operationId: getResult
      description: 'description'
      responses:
        200:
          description: success
          schema:
            $ref: '#/definitions/Result'
        400:
          description: bad request
          schema:
            $ref: '#/definitions/Result'
        500:
          description: internal server error
          schema:
            $ref: '#/definitions/Result'  

有效载荷示例:

<?xml version="1.0" encoding="utf-8"?>
<Result>
 <DateTime>2018-06-19T07:50:21.8688563Z</DateTime>
 <Key>a key</Key>
 <Value>a value</Value>
</Result>

Pom.xml 代码生成部分

  <plugin>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-codegen-maven-plugin</artifactId>
    <version>${swagger-codegen-maven-plugin.version}</version>
    <executions>
     <execution>
      <goals>
       <goal>generate</goal>
      </goals>
      <configuration>
       <inputSpec>${project.basedir}/src/main/resources/api.yml</inputSpec>
       <language>java</language>
       <library>jersey2</library> 
       <output>${project.build.directory}/generated-sources</output>
       <apiPackage>${default.package}.handler.generated</apiPackage>
       <modelPackage>${default.package}.model.generated</modelPackage>
       <invokerPackage>${default.package}.handler.generated</invokerPackage>
       <generateApiTests>false</generateApiTests>
       <generateApiDocumentation>false</generateApiDocumentation>
       <generateModelTests>false</generateModelTests>
       <configOptions>
        <sourceFolder>src/main/java</sourceFolder>
        <dateLibrary>joda</dateLibrary>
       </configOptions>
      </configuration>
     </execution>
    </executions>
   </plugin>

我怎样才能做到这一点?

使用 Swagger 2.0 版、swagger-code-gen 2.3.1 版和 Jersey lib 2.27 版

4

0 回答 0