2015-09-10 5 views
0

У меня есть служба RESTful на Джерси, установленная на apache Servicemix. Один из методов этой службы не работает, журнал ошибок выглядит следующим образом:multipart/mixed MessageBodyWriter не найден (Jersey, Servicemix)

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, также я развернул пакеты OSGI трикотажа на Servicemix.

Не могли бы вы указать мне, где может произойти ошибка, потому что я уже прочитал все документы и форумы и до сих пор не знаю, что делать.

Спасибо!

+1

'ServletContainer' принимает' ResourceConfig' в качестве аргумента. Вы можете создавать безопасные типы в «ResourceConfig», а не в зависимости от строк. Таким образом, вы действительно _know_, если у вас есть все необходимые зависимости. Прямо сейчас мы не можем сказать. У свойств Spring нет ошибок компиляции, и вы фактически не показываете нам свои зависимости. –

+0

Я бы дважды проверить, что у меня есть 'org.glassfish.jersey.media: jersey-media-multipart' зависимость в pom.xml. Кроме того, я использую 'register (MultiPartFeature.class)' вызов в моем классе приложения, который расширяет 'ResourceConfig', но, я думаю, способ регистрации MultipartFeature также должен работать. – jFrenetic

ответ

0

Попробуйте это: Сделайте запись для MultiPartFeature под Init-парам для ServletContainer

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