Задний план
Требуется связать конкретный класс с параметром для метода @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
- Не используя весну