I am working on a project and thought of using JDBI but although jdbi seems to work wonderfully with simple DAOs, I seem to have hit a roadblock.
@RegisterMapper(YoutubeChannelMapper.class)
public interface YoutubeChannelRepository extends ChannelRepository<YoutubeChannel> {
@Override
@SqlQuery("select * from channel where id = :id")
public YoutubeChannel get(@Bind("id") Long id);
@Override
@GetGeneratedKeys
@SqlUpdate("insert into remote_media (publisherId, created, lastUpdated, name, category, oauthToken, oauthTokenSecret) values(:publisherId, :created, :lastUpdated, :name, :category, :oauthToken, :oauthTokenSecret)")
public Long save(@BindBean YoutubeChannel entity);
@Override
@SqlUpdate("delete from remote_media where id = :id")
public void delete(@Bind("id") Long id);
@Override
@SqlUpdate("update channel set lastUpdated = :lastUpdated, name = :name, oauthToken = :oauthToken, oauthTokenSecret = :oauthTokenSecret where id = :id")
public void update(@BindBean YoutubeChannel entity);
}
so we have a ChannelRepository and multiple subclasses of this interface such as YoutubeChannelRepository and VimeoChannelRepository. Now, in my resource if I create it as
@Path("/dummy")
@Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)
public class DummyResource {
private static final Log LOG = Log.forThisClass();
ChannelRepository channelRepository;
RemoteMediaRepository remoteMediaRepository;
public DummyResource(RemoteMediaRepository remoteMediaRepository, ChannelRepository channelRepository) {
this.remoteMediaRepository = remoteMediaRepository;
this.channelRepository = channelRepository;
}
@GET @Path("/medias/{id}")
public RemoteMedia getRemoteMedia(@PathParam("id") Long id) {
RemoteMedia remoteMedia = remoteMediaRepository.get(id);
if(remoteMedia == null) {
LOG.debug("Unable to find remoteMedia: {}", id);
throw new NotFoundException();
}
LOG.debug("Found remoteMedia: {}", remoteMedia);
return remoteMedia;
}
@GET @Path("/channels/youtube/{id}")
public YoutubeChannel getChannel(@PathParam("id") Long id) {
AbstractEntity channel = channelRepository.get(id);
if(channel == null) {
LOG.debug("Unable to find channel: {}" ,id);
throw new NotFoundException();
}
LOG.debug("Found Channel: {}", channel);
return (YoutubeChannel) channel;
}
}
ERROR [2012-10-18 05:34:31,979] com.yammer.dropwizard.jersey.LoggingExceptionMapper: Error handling a request: 705a19866397ff71
! java.lang.NullPointerException: null
! at org.skife.jdbi.v2.sqlobject.SqlObject.invoke(SqlObject.java:145)
! at org.skife.jdbi.v2.sqlobject.SqlObject$1.intercept(SqlObject.java:58)
! at org.skife.jdbi.v2.sqlobject.CloseInternalDoNotUseThisClass$$EnhancerByCGLIB$$2fe777e7.get(<generated>)
! at com.brightcove.yeti.resources.DummyResource.getChannel(DummyResource.java:43)
! at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
! at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
! at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
! at java.lang.reflect.Method.invoke(Method.java:597)
! at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
! at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
! at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
! at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
! at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
! at com.sun.jersey.server.impl.uri.rules.ResourceObjectRule.accept(ResourceObjectRule.java:100)
! at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
! at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
! at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1480)
! at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1411)
! at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
! at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
! at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
! at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
! at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
! at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
! at com.yammer.dropwizard.jetty.NonblockingServletHolder.handle(NonblockingServletHolder.java:47)
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1331)
! at com.yammer.dropwizard.servlets.ThreadNameFilter.doFilter(ThreadNameFilter.java:29)
! at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1302)
! at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:448)
! at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1067)
! at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:377)
! at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1001)
! at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
! at com.yammer.metrics.jetty.InstrumentedHandler.handle(InstrumentedHandler.java:200)
! at org.eclipse.jetty.server.handler.GzipHandler.handle(GzipHandler.java:233)
! at com.yammer.dropwizard.jetty.BiDiGzipHandler.handle(BiDiGzipHandler.java:123)
! at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
! at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
! at org.eclipse.jetty.server.Server.handle(Server.java:360)
! at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)
! at org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:47)
! at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)
! at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)
! at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
! at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
! at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:66)
! at org.eclipse.jetty.server.nio.BlockingChannelConnector$BlockingChannelEndPoint.run(BlockingChannelConnector.java:293)
! at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
! at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
! at java.lang.Thread.run(Thread.java:680)
Upon replacing all instances of ChannelRepository with YoutubeChannelRepository, everything works just fine.
What is the problem here? Am I doing something wrong or is this just not supported by jdbi?