У меня есть служба 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.
Не могли бы вы указать мне, где может произойти ошибка, потому что я уже прочитал все документы и форумы и до сих пор не знаю, что делать.
Спасибо!
'ServletContainer' принимает' ResourceConfig' в качестве аргумента. Вы можете создавать безопасные типы в «ResourceConfig», а не в зависимости от строк. Таким образом, вы действительно _know_, если у вас есть все необходимые зависимости. Прямо сейчас мы не можем сказать. У свойств Spring нет ошибок компиляции, и вы фактически не показываете нам свои зависимости. –
Я бы дважды проверить, что у меня есть 'org.glassfish.jersey.media: jersey-media-multipart' зависимость в pom.xml. Кроме того, я использую 'register (MultiPartFeature.class)' вызов в моем классе приложения, который расширяет 'ResourceConfig', но, я думаю, способ регистрации MultipartFeature также должен работать. – jFrenetic