Интерфейсы и @RequestBody - PullRequest
       22

Интерфейсы и @RequestBody

7 голосов
/ 19 января 2011

В настоящее время я работаю над проектом, который позволяет пользователям бронировать (через Интернет) использование выбранного ресурса на определенный период времени.В этой программе я пытаюсь придерживаться философии Spring (и общей передовой практики) программирования для интерфейсов и поэтому стараюсь использовать интерфейсы везде, где функциональность повторяется среди конкретных классов.

Один интерфейс, который я создалназывается BookableResourceController, который определяет методы, необходимые контроллеру для обработки минимально необходимой функциональности для любого типа ресурса, подлежащего резервированию.Я также использую второй интерфейс, BookableResource, который определяет, какие объекты моделируют ресурс, который разрешено бронировать через приложение.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что некоторые из методов, определенных BookableResourceController, используют отображение @RequestBody для преобразования объекта JSON в параметр метода, а поскольку Джексон может преобразовывать только JSON в объекты "SimpleType", Я получаю сообщение об ошибке, если я указываю входной параметр как BookableResource.

@RequestMapping(value="/delete.html", method = RequestMethod.POST)  
public ModelAndView processDeleteResource(
    @RequestBody BookableResource resource); 

Невозможно создать экземпляр org.codehaus.jackson.map.type.SimpleType, проблема: абстрактные типы могутсоздается только с дополнительной информацией о типе

Из того, что я могу сказать, эта ошибка означает, что мне нужно будет определить конкретную реализацию BookableResource, то есть мне, скорее всего, придется исключить эти методы из интерфейса дажехотя любой контроллер, который должен использоваться для этой цели, потребует этих методов.

Я спрашиваю, знает ли кто-нибудь способ определения интерфейса как объекта, который ожидается от сопоставления @RequestBody с использованием JSONили у кого-нибудь есть предложениякак структурировать мой интерфейс контроллера для включения этих методов?

Cheers

Ответы [ 2 ]

11 голосов
/ 19 января 2011

Я не уверен, что это сработает, но вы можете попробовать сделать его универсальным:

public interface BookableResourceController<R extends BookableResource> {
    @RequestMapping(value="/delete.html", method = RequestMethod.POST)
    public ModelAndView processDeleteResource(@RequestBody R resource); 
}
1 голос
/ 20 января 2011

Дополнительный путь, который можно использовать, - это аннотировать интерфейс с помощью аннотации Джексона:

@JsonDeserialize(as=BookableResourceImp.class)

(возможно, с использованием смешанных аннотаций, если не требуется добавлять его непосредственно в класс интерфейса)

EDIT : Другая возможность - использовать SimpleModule метод addAbstractTypeMapping() для указания типа реализации.Это позволяет избежать связи между интерфейсом и реализацией и может (или не может) быть более удобным способом регистрации этого аспекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...