Данные из Джерси, состоящие из нескольких частей, в REST API не работают ни с сетью. xml, ни с ResourceConfig - PullRequest
0 голосов
/ 05 февраля 2020

Я реализую REST API в сервлете Glassfi sh с использованием Jersey (2.22.2) и OpenAPI (1.1.2). Я хотел бы разрешить отправку файла Excel в виде данных составной формы на следующую конечную точку с помощью аннотации @FormDataParam:

@PUT
@Path("/upload")
@Parameter(description = "Import XML file", required = true, name = "file")
@Parameter(required = true, name = "isABC")
@Parameter(required = true, name = "type")
@Parameter(required = true, name = "year")
@Operation(description = "Imports an Excel file")
@APIResponse(responseCode = "200", description = "Success")
@APIResponse(responseCode = "401", description = "Authentication failed")
@APIResponse(responseCode = "500", description = "Unexpected exception")
@Consumes({MediaType.MULTIPART_FORM_DATA})
@RolesAllowed(UserRoles.ADMIN)
public Response importExcel(@FormDataParam("file") File file, @FormDataParam("isABC") boolean isABC, @FormDataParam("type") String type, @FormDataParam("year") int year) throws MyException {
    importHandler.import(file, isABC, type, year);
    return Response.status(Response.Status.OK).build();
}

Когда я запускаю сервлет Glassfi sh, я получаю следующие исключения:

WARNING: No injection source found for a parameter of type public javax.ws.rs.core.Response com.mypackage.importExcel(java.io.File,boolean,java.lang.String,int) throws com.mypackage.MyException at index 0.

org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.mypackage.MyResource.importExcel

Настройка MultipartFeature с веб-интерфейсом. xml

В соответствии с этим потоком Stackoverflow Мне нужно использовать jersey-media-multipart зависимость, а не jersey-multipart и убедитесь, что я использую ту же версию, что и основная зависимость Джерси (2.22.2). Мне также нужно зарегистрировать MultiPartFeature, что я и сделал в своем web.xml следующим образом:

<servlet>
    <servlet-name>My Servlet</servlet-name>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
</servlet>

После этих изменений я все еще получил ту же ошибку.


Настройка MultipartFeature с помощью ResourceConfig

Я попытался зарегистрировать MultipartFeature в ResourceConfig вместо этого:

@ApplicationPath("/api")
@DeclareRoles({ UserRoles.USER, UserRoles.ADMIN })
@OpenAPIDefinition(info = @Info(title = "Backend service", version = "1.0.0"), servers = {
        @Server(url = "/backend", description = "localhost") })
public class ApplicationConfig extends ResourceConfig {

    public ApplicationConfig() {
        register(MultiPartFeature.class);

        register(MyExceptionMapper.class);
        // ... other ExceptionMappers

        register(AdminResource.class);
        register(UserResource.class);
        // ... other Resource classes
    }

}

Мне все еще нужно выполнить некоторую настройку в моем web.xml. В соответствии с этим потоком Stackoverflow Мне нужно определить ResourceConfig в web.xml, чтобы использовать их вместе:

<servlet>
   <servlet-name>Backend</servlet-name>
   <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>com.mypackage.ApplicationConfig</param-value>
   </init-param>
   <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.mypackage.business.api</param-value>
   </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
</servlet>

Теперь приложение работает, но я не могу связаться ни с одним из конечные точки API, потому что автоматически сгенерированная конфигурация OpenAPI пуста:

paths: {}
components: {}
...