Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST API中的多部分表单数据既不使用web.xml也不使用ResourceConfig_Java_Rest_Jersey_Multipartform Data_Openapi - Fatal编程技术网

Java REST API中的多部分表单数据既不使用web.xml也不使用ResourceConfig

Java REST API中的多部分表单数据既不使用web.xml也不使用ResourceConfig,java,rest,jersey,multipartform-data,openapi,Java,Rest,Jersey,Multipartform Data,Openapi,我正在使用Jersey(2.22.2)和OpenAPI(1.1.2)在Glassfish servlet中实现RESTAPI。我想允许使用@FormDataParam注释将Excel文件作为多部分表单数据发送到以下端点: @PUT @Path("/upload") @Parameter(description = "Import XML file", required = true, name = "file") @Parameter(required = true, name = "isABC

我正在使用Jersey(2.22.2)和OpenAPI(1.1.2)在Glassfish servlet中实现RESTAPI。我想允许使用
@FormDataParam
注释将Excel文件作为多部分表单数据发送到以下端点:

@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();
}
运行Glassfish servlet时,会出现以下异常:

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

使用web.xml配置MultipartFeature

根据需要,我需要使用
jersey media multipart
依赖项,而不是
jersey multipart
,并确保我使用的版本与jersey core依赖项(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>
我仍然需要在我的
web.xml
中进行一些配置。根据需要,我需要在
web.xml
中定义
ResourceConfig
,以便将两者结合使用:

<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>

如果使用带有
@ApplicationPath
注释的ResourceConfig(如第二个堆栈溢出链接中所述),则不需要web.xml。@PaulSamsotha我正在
web.xml
中定义我的安全角色和安全约束。也许还有一种方法可以使用注释来配置它,但我不希望触碰正在运行的系统,尤其是
web.xml
似乎有一些优点(请参阅)。您不需要定义。你的那个甚至都不正确。你应该把你的包放在param值中,但你只是有“jersey”。我怀疑那是你的包裹名称。这就是为什么你没有任何路径。你是对的,我没有注意到那里。我将param值更改为正确的包名。现在,当我删除我的
web.xml
时,OpenAPI结构看起来是正确的,但所有端点都有404个错误。可能是因为安全配置。使用
@DeclareRoles
注释声明角色是很简单的,但是
@ServletSecurity
注释似乎很难使用。我会尽力弄清楚,但我更愿意保留我的
web.xml
。只需删除
声明,而不是整个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>
paths: {}
components: {}