当前位置: 首页 > 知识库问答 >
问题:

Jax ws-formdata上载响应返回500错误

周涵畅
2023-03-14

各位议员好。

背景信息:这是一个基于Spring Boot的项目,它使用JAX-RS/Jersey作为RESTHTTP服务器,而不是spring rest。

错误说明和问题:

将一个文件从一台服务器发送到另一台服务器,并收到响应。(很简单吧?)从功能上讲,下面的代码正在运行。但是,发送方得到的不是200响应,而是500个内部服务器错误和以下堆栈跟踪。

java.lang.IllegalStateException: No such MIME Part: Part=0:binary
at org.jvnet.mimepull.DataHead.read(DataHead.java:115)
at org.jvnet.mimepull.MIMEPart.read(MIMEPart.java:69)
at org.glassfish.jersey.media.multipart.BodyPartEntity.getInputStream(BodyPartEntity.java:65)
at org.glassfish.jersey.media.multipart.internal.FormDataParamValueParamProvider$FormDataParamValueProvider.apply(FormDataParamValueParamProvider.java:263)
at org.glassfish.jersey.media.multipart.internal.FormDataParamValueParamProvider$FormDataParamValueProvider.apply(FormDataParamValueParamProvider.java:222)
at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.apply(ParamValueFactoryWithSource.java:50)
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:64)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:109)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:469)

调试之后,我注意到响应中包含了receiver server@FormDataParam。ok()对象。

如果我定义了响应,这是我不理解的部分。好的。为什么它包含请求参数?根据发送响应的类型,文件已被使用。

下面的图片是在进入响应时在调试中拍摄的。

配置:球衣设置

@Configuration

@ApplicationPath(“/idoc”)公共类Jersey配置扩展了ResourceConfig{

private static final Logger logger = LoggerFactory.getLogger(JerseyConfiguration.class);

public JerseyConfiguration() {
    packages("ctx.cf.arcus.controllers");
    register(MultiPartFeature.class);
    register(CORSResponseFilter.class);
    register(JacksonProvider.class);
    register(DebugExceptionMapper.class);

    HashMap<String, Object> properties = new HashMap<String, Object>();
    properties.put("jersey.config.server.response.setStatusOverSendError", true);

    setProperties(properties);

}

}

发送服务器I配置了以下代码:

Client client = ClientBuilder.newClient(new ClientConfig().register(MultiPartFeature.class));

    WebTarget webTarget = client.target(url);
    FormDataMultiPart part = new FormDataMultiPart();

    final FormDataBodyPart p1 = new StreamDataBodyPart("file", this.document.getStream());
    part.bodyPart(p1);
    final FormDataBodyPart p2 = new FormDataBodyPart("size", String.valueOf(this.document.getSize()));
    part.bodyPart(p2);
    Response response = null;
    try {
        response = webTarget.request().header("Authorization", "Bearer " + token)
                .post(Entity.entity(part, MediaType.MULTIPART_FORM_DATA), Response.class);

    } catch (Exception e) {
        response = Response.serverError().build();
    }

接收服务器

@POST
@Path("/idoc")
public Response idocPassThroughTranslation(@FormDataParam("file") InputStream uploadedInputStream,
        @FormDataParam("size") long size, @Context HttpServletRequest request)
        throws IOException, ServletException, FormatException {

    <Logic omitted>

    return Response.ok().build();
}

共有1个答案

屈宏爽
2023-03-14

好吧我花了一天时间试图解决这个问题。但未能找到这种行为的根本原因。

所以我选择了一个变通解决方案

使用jersey exception mapper,我检查抛出的特定期望和方法,因为它应该只应用于代码的那个位置和响应状态,以查看是否需要用200 ok覆盖它,或者用500传递它。

@Provider
public class RouterResponseExceptionMapper implements 
ExceptionMapper<IllegalStateException> {

@Context
private HttpServletResponse response;

@Context
private ResourceInfo resourceInfo;

@Override
public Response toResponse(IllegalStateException exception) {
    
    if (this.resourceInfo.getResourceMethod().getName().equals("PassThrough")
            && this.response.getStatus() == 200) {
        return Response.ok().build();
    } else {
        return Response.serverError().entity(Throwables.getStackTraceAsString(exception)).build();
    }
}

}

 类似资料:
  • 我正在制作一个简单的Rest服务,它必须将JSON请求中的数据添加到数据库(MongoDB)中。当我向服务发出请求时出现问题,服务器会出现以下错误: Controller@0.0.0start C:\users\Fernando\Google Drive\tcc_Fernando_Felipe\Controller\Controller节点./bin/www {[Error:找不到模块“../bu

  • 我部署基本Laravel项目到服务器。当我点击我的域名,它返回默认的欢迎视图。当我把简单的道路(见下文)添加到代码中,并尝试在浏览器中输入该路线时,它会返回500个内部错误。除"/"根路由外,所有路由都返回500错误。 文件夹结构: Laravel文件位于Laravel目录中,但来自公共目录的文件位于api目录中。 .api目录中的htaccess文件: 存储目录和其中的所有内容对任何人都是可写、

  • 问题内容: 我正在用Java面对这个问题。我想从URL获取一些HTML信息。该代码已经运行了很长时间,但是突然,它停止了工作。 当我使用浏览器访问此URL时,它毫无问题地打开。 代码: 例外: 怎么了?主人阻止了我吗? 问题答案: HTTP状态代码500通常表示Web服务器代码已崩溃。您需要预先确定状态代码,如果有错误,请阅读。它可能即包含有关问题的信息。 如果主机阻止了您,您宁愿获得4nn状态码

  • 这个错误的原因是什么?当我直接从浏览器调用URL时,它的工作非常完美。

  • 问题内容: 我正在通过Ajax将幻灯片(Jquery Ui Slider)中的每个滑块值传递到我的Controller。 Slider + Ajax看起来像这样: 因此,我确实有这样的想法: 我的路线如下所示: 在我的Controller方法中,我这样调用它: Log :: info($ sliderValue)告诉我,我确实在每张幻灯片上都获得了正确的滑块值。 当我尝试返回到编辑视图时,在控制台

  • 我使用的是Nexus3.2,我有包含npmjs和npm-internal存储库的npm-all组,但例如,当我执行时,返回以下错误: npm信息如果以OK结束,则它可以工作 npm信息使用npm@3.10.3 npm信息使用节点@v6.5.0 npm信息尝试注册表请求尝试#1在17:31:16 npm http请求GET http://x.x.x.x:8081/repository/npm-all