#jaxb #jersey #guice
#jaxb #джерси #guice
Вопрос:
Я использую интерфейс Google с Джерси (jax-rs). Следующий метод выдает исключение JAXB (JAXB не может обрабатывать интерфейсы), если я его вызываю:
@POST
public void addUser(UserTO user){
}
UserTO — это интерфейс, но в Guice я привязал его к реализации:
bind(UserTO.class).to(DefaultUserTO.class);
Я думал, что Guice должен быть в состоянии справиться с этим. Но, возможно, что-то в моем запуске сервера не так:
Injector injector =
Guice.createInjector(new GuiceServerModule(),
new JerseyServletModule() {
@Override
protected void configureServlets() {
// Route all requests through GuiceContainer
serve("/*").with(GuiceContainer.class);
}
});
// Create the server.
Server server = new Server(12345);
// Create a servlet context and add the jersey servlet.
ServletContextHandler sch = new ServletContextHandler(server, "/");
// Add our Guice listener that includes our bindings
sch.addEventListener(new GuiceServletConfig(injector));
// Then add GuiceFilter and configure the server to
// reroute all requests through this filter.
sch.addFilter(GuiceFilter.class, "/*", null);
// Must add DefaultServlet for embedded Jetty.
// Failing to do this will cause 404 errors.
// This is not needed if web.xml is used instead.
sch.addServlet(DefaultServlet.class, "/");
// Start the server
server.start();
// Wait until server shut down
server.join();
Или я должен использовать только реализацию?
Ответ №1:
Вам нужно использовать конкретный класс. Guice здесь не в игре. Экземпляр пользователя создается Jersey с использованием JAXB. Guice (или любая другая платформа DI) ничего не может сделать. Вы также должны удалить привязку для UserTO. Как правило, я бы сказал, что это не очень хорошая идея, чтобы платформа DI управляла объектами, представляющими данные.