【问题标题】:multipart/mixed MessageBodyWriter not found (Jersey, Servicemix)未找到多部分/混合 MessageBodyWriter(Jersey、Servicemix)
【发布时间】:2015-12-07 08:16:34
【问题描述】:

我在 apache Servicemix 上安装了 Jersey RESTful 服务。此服务的一种方法不起作用,错误日志如下所示:

2015-09-10 12:12:25,374 | ERROR | tp1599275925-203 | WriterInterceptorExecutor | ? ? | 250 - org.glassfish.jersey.core.jersey-common - 2.17.0 | MessageBodyWriter not found for media type=multipart/mixed, type=class org.glassfish.jersey.media.multipart.FormDataMultiPart, genericType=class org.glassfish.jersey.media.multipart.MultiPart.

方法如下:

@Authenticated
@Path("/floor")
@POST
@Consumes("application/json")
@Produces("multipart/mixed")
public MultiPart getFloorHeatMap(@NotNull(message = "You must provide a floor.") @Valid Floor floor) {


    try {
        Map<File, String> resp = null;

        if (floor == null) {
            throw new Exception("you must provide a floor");
        }
        ValidatorFactory factory = Validation.byDefaultProvider()
                .providerResolver(new OSGiServiceDiscoverer())
                .configure()
                .buildValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Floor>> constraints = validator.validate(floor, Default.class);

        for (ConstraintViolation<Floor> cv : constraints) {
            throw new Exception(cv.getMessage());
        }

        resp = template.requestBody(AppServerRouteBuilder.GET_HEATMAPS_ENDPOINT, floor, Map.class);


        final MultiPart multipart = new FormDataMultiPart();

        if (resp != null) {
            for (File file : resp.keySet()) {
                multipart.bodyPart(new FileDataBodyPart(file.getName(), file, new MediaType("image", resp.get(file))));
            }
            return multipart;
          } else {
            ServiceResponse response = new ServiceResponse(ResultCode.NOT_FOUND);
            return new FormDataMultiPart().field("Response", "Failed to get HeatMaps", MediaType.TEXT_PLAIN_TYPE);
         }
    } catch (Exception e) {
        LOG.error("EXCEPTION CAUGHT");
        LOG.error(e.getMessage(), e);

        ServiceResponse response = new ServiceResponse(ResultCode.INTERNAL_ERROR, e.getMessage());
        return new FormDataMultiPart().field("Response", "Failed to get HeatMaps", MediaType.TEXT_PLAIN_TYPE);
    }

}

我正在以这种方式启动我的应用程序:

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");

        server = new Server(Integer.parseInt(getPort()));
        server.setHandler(context);

        ServletHolder sh = new ServletHolder(new ServletContainer());

        Map<String, String>map = new HashMap<>();
        map.put("jersey.config.server.provider.classnames",
                 "org.glassfish.jersey.jackson.JacksonFeature,org.glassfish.jersey.media.multipart.MultiPartFeature");
        map.put("jersey.config.server.provider.packages", "com.extremenetworks.rfplanner.wb.resources");
        map.put("jersey.config.server.jsonFeature", "JacksonFeature");
        map.put("org.glassfish.jersey.media.multipart.MultiPartFeature", "MultiPartFeature");
        map.put("jersey.config.beanValidation.enableOutputValidationErrorEntity.server", "true");
        sh.setInitParameters(map);

        context.addServlet(sh, getPathSpec());
        server.start();

我的 .pom 文件中包含所有必需的依赖项,并且我已将 jersey OSGI 捆绑包部署到 Servicemix。

能否请您指出错误可能来自哪里,因为我已经阅读了所有文档和论坛,但仍然不知道该怎么做。

谢谢!

【问题讨论】:

  • ServletContainerResourceConfig 作为参数。您可以在 ResourceConfig 中进行类型安全的配置,而不是依赖于字符串。这样,您实际上知道您是否拥有所有必需的依赖项。现在我们还不能说。 Spring 属性没有编译错误,您实际上并没有向我们展示您的依赖项。
  • 我会仔细检查我在 pom.xml 中有 org.glassfish.jersey.media:jersey-media-multipart 依赖项。另外,我在扩展ResourceConfig 的Application 类中使用register(MultiPartFeature.class) 调用,但我想您注册MultipartFeature 的方式也应该有效。

标签: java rest jersey multipart apache-servicemix


【解决方案1】:

试试这个:在 ServletContainer 的 init-param 下为 MultiPartFeature 创建一个条目

<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register resources and providers -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.mycompany.mypackage</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>
<load-on-startup>1</load-on-startup>
</servlet>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 2013-10-08
    • 2015-08-05
    • 2015-01-26
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多