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

Фон

Нужно связать конкретный класс с параметром для REST-сервера @POST метод в пределах 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: абстрактные типы либо должны быть сопоставлены с конкретными типами, либо иметь собственный десериализатор, либо содержать дополнительную информацию о типе.

Deserialize

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

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

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

Вопрос

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

Среда

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

1 ответ

Решение

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

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

@JsonDeserialize(using = YourDeserializer.java)

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

Другие вопросы по тегам