Я реализую 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: {}