Подключите конкретную реализацию к интерфейсу в blueprint.xml

Задний план

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

Проблема

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

Код

Ява

Сервер 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.xml включают:

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

Исключение

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

Вызвано: com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр NotificationRequest: абстрактные типы либо должны быть сопоставлены с конкретными типами, иметь настраиваемый десериализатор или содержать дополнительную информацию о типе.

Десериализовать

Можно десериализовать класс, используя:

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

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

Вопрос

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

Окружающая обстановка

  • Ява 1.8
  • Верблюд Apache 2.x
  • JAX-РС 2.1
  • Джексон JAX-RS JSON-провайдер 2.9.x
  • ОСГи 1.2.1
  • Не используя весну

person Dave Jarvis    schedule 21.09.2018    source источник


Ответы (1)


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

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

@JsonDeserialize(using = YourDeserializer.java)

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

person Federico Cerruto    schedule 22.09.2018