Проводная конкретная реализация для интерфейса в blueprint.xml - PullRequest
0 голосов
/ 21 сентября 2018

Фон

При попытке связать конкретный класс с параметром для @POST метода REST-сервера в blueprint.xml.

Проблема

Не удалось найти привязку данных Джексонаконкретная реализация для параметра send метода.

Код

Java

Сервер REST имеет один метод send, определяемый как:

public interface NotificationServer {
    @POST
    Response send(NotificationRequest notificationRequest);
}

NotificationRequest также является интерфейсом:

public interface NotificationRequest {

Конкретная реализация NotificationServer, называемая EmailNotificationServerImpl, реализует интерфейс:

public class EmailNotificationServerImpl implements NotificationServer {
    @Override
    public Response send(final NotificationRequest request) {

Blueprint

Соответствующие части blueprint.xml включают:

<bean class="EmailNotificationServerImpl" id="emailNotificationServerImpl">...</bean>
<bean class="NotificationRequestImpl" id="notificationRequestImpl" />
<service interface="NotificationRequest" ref="notificationRequestImpl" />

Исключение

Сообщение об ошибке Джексона:

Причина: com.fasterxml.jackson.databind.Можно десериализовать класс, используя:

@JsonDeserialize(as = NotificationRequestImpl.class)
public interface NotificationRequest {

Хотя это работает, оно не полностью отсоединяет реализацию от интерфейса.

Вопрос

Как конкретная реализация может быть подключена в blueprint.xml, чтобыаннотация @JsonDeseralize не нужна?

Среда

  • Java 1.8
  • Apache Camel 2.x
  • JAX-RS 2.1
  • Джексон JAX-RS JSON Provider 2.9.x
  • OSGi 1.2.1
  • Не используется Spring

1 Ответ

0 голосов
/ 22 сентября 2018

Используйте собственного провайдера, который расширяет JacksonJsonProvider в определении сервера JAX-RS в теге <jaxrs:providers>.

Или используйте пользовательский десериализатор, который расширяет StdSerializer :

@JsonDeserialize(using = YourDeserializer.java)

Или используйте полиморфизм и @JsonTypeInfo + @JsonSubtypes аннотации.

...