Hi Brian, Thank you for your prompt reply, I thought that might be the case (and I agree, the way generics ended up being implemented is sadistic)
I went with B) already but I wanted to make sure this is recorded. I filed this here for reference: https://github.com/basho/riak-java-client/issues/493 Cheers Cos On Wednesday, 14 January 2015 at 21:32, Brian Roach wrote: > Cosmin - > > It would appear that the crazy generics involved are indeed broken > when it comes to UpdateValue the "ClobberUpdate" - it's not pulling > out the type correctly. I'll have to try and figure out why that is. > Type erasure will make you weep ;) > > Two ways to deal with it at the moment: > > A) Pass in a TypeReference explicitly: > > TypeReference<SomeEntity> tRef = new TypeReference<SomeEntity>(){}; > ... > .withUpdate(UpdateValue.Update.clobberUpdate(entity), tRef) > ... > > B) Create your own class that subclasses UpdateValue.Update that does > the same thing as a "clobber update" : > > public static class UpdateEntity extends UpdateValue.Update<SomeEntity> > { > private final SomeEntity entity; > > public UpdateEntity(SomeEntity e) > { > this.entity = e; > } > > @Override > public SomeEntity apply(SomeEntity original) > { > return entity; > } > > } > > ... > .withUpdate(new UpdateEntity(entity)) > ... > > > > I've tested both of these solutions and they both work. > > Thanks and sorry for the problem, > - Roach > > On Wed, Jan 14, 2015 at 1:39 PM, Cosmin Marginean <cosmin...@gmail.com > (mailto:cosmin...@gmail.com)> wrote: > > I’m doing a fairly “by the book” clobber update (store and fetch below work > > fine) on an entity using the Java client. I’m seeing an error that happens > > at type-inference time within the Riak Java client. I’m pasting below the > > exact test that I’m using to generate this, as well as the stacktrace. > > Please let me know if I’m missing something or if it’s a known bug. > > > > Thank you > > Cosmin > > > > @Test > > public void testRiakUpdate() throws Exception { > > RiakNode node = new > > RiakNode.Builder().withRemoteAddress("192.168.168.2").withRemotePort(8087).build(); > > RiakCluster cluster = new RiakCluster.Builder(node).build(); > > cluster.start(); > > RiakClient client = new RiakClient(cluster); > > > > SomeEntity entity = new SomeEntity(); > > entity.setName("John Doe"); > > entity.setDescription("Some Description"); > > Location location = new Location(new Namespace("bucket"), "entity-key"); > > > > // Store > > StoreValue storeOp = new > > StoreValue.Builder(entity).withLocation(location).build(); > > client.execute(storeOp); > > > > // Fetch > > FetchValue fetchOp = new FetchValue.Builder(location).build(); > > entity = client.execute(fetchOp).getValue(SomeEntity.class); > > > > // Update > > entity.setName("New name"); > > UpdateValue updateOp = new UpdateValue.Builder(location) > > .withFetchOption(FetchValue.Option.DELETED_VCLOCK, true) > > .withUpdate(UpdateValue.Update.clobberUpdate(entity)) > > .build(); > > client.execute(updateOp).getValue(SomeEntity.class); > > } > > > > private static class SomeEntity { > > private String name; > > private String description; > > > > public String getName() { > > return name; > > } > > > > public void setName(String name) { > > this.name (http://this.name) = name; > > } > > > > public String getDescription() { > > return description; > > } > > > > public void setDescription(String description) { > > this.description = description; > > } > > } > > > > > > > > > > java.lang.ClassCastException: > > sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to > > java.lang.Class > > at > > com.basho.riak.client.api.commands.kv.UpdateValue$1.handle(UpdateValue.java:149) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.api.commands.ListenableFuture.notifyListeners(ListenableFuture.java:78) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.api.commands.CoreFutureAdapter.handle(CoreFutureAdapter.java:120) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.core.FutureOperation.fireListeners(FutureOperation.java:131) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.core.FutureOperation.setResponse(FutureOperation.java:170) > > ~[riak-client-2.0.0.jar:na] > > at com.basho.riak.client.core.RiakNode.onSuccess(RiakNode.java:823) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.core.netty.RiakResponseHandler.channelRead(RiakResponseHandler.java:58) > > ~[riak-client-2.0.0.jar:na] > > at > > io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:155) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:116) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:494) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:461) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:378) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05] > > 20:34:13.390 [nioEventLoopGroup-2-1] DEBUG > > c.b.riak.client.core.FutureOperation - IllegalStateException; required: > > [CREATED, WRITTEN, RETRY] current: COMPLETE > > 20:34:13.391 [nioEventLoopGroup-2-1] WARN > > i.n.channel.DefaultChannelPipeline - An exception was thrown by a user > > handler's exceptionCaught() method while handling the following exception: > > java.lang.ClassCastException: > > sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to > > java.lang.Class > > at > > com.basho.riak.client.api.commands.kv.UpdateValue$1.handle(UpdateValue.java:149) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.api.commands.ListenableFuture.notifyListeners(ListenableFuture.java:78) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.api.commands.CoreFutureAdapter.handle(CoreFutureAdapter.java:120) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.core.FutureOperation.fireListeners(FutureOperation.java:131) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.core.FutureOperation.setResponse(FutureOperation.java:170) > > ~[riak-client-2.0.0.jar:na] > > at com.basho.riak.client.core.RiakNode.onSuccess(RiakNode.java:823) > > ~[riak-client-2.0.0.jar:na] > > at > > com.basho.riak.client.core.netty.RiakResponseHandler.channelRead(RiakResponseHandler.java:58) > > ~[riak-client-2.0.0.jar:na] > > at > > io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:155) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.handler.codec.ByteToMessageCodec.channelRead(ByteToMessageCodec.java:108) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:340) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:326) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:785) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:116) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:494) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:461) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:378) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:350) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at > > io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101) > > [netty-all-4.0.17.Final.jar:4.0.17.Final] > > at java.lang.Thread.run(Thread.java:745) [na:1.8.0_05] > > > > > > > > _______________________________________________ > > riak-users mailing list > > riak-users@lists.basho.com (mailto:riak-users@lists.basho.com) > > http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com > > > > > >
_______________________________________________ riak-users mailing list riak-users@lists.basho.com http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com