Проводная конкретная реализация для интерфейса в 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
аннотаций.