【问题标题】:Cassandra mapper not mapping to the classCassandra 映射器未映射到类
【发布时间】:2016-10-02 17:16:09
【问题描述】:

我正在构建一个 REST API,并且我有访问器,

    @Accessor
public interface ActiveBidAccessor {
    @Query("SELECT * FROM keyspace.active_bid WHERE username = :username")
    public Result<ActiveBid> getAllByUsersname(@Param("username") String username);


    @Query("SELECT * FROM keyspace.active_bid")
    public Result<ActiveBid> getAll();
}

和 ActiveBid 类

@Table(keyspace = "keyspace", name = "active_bid", readConsistency = "QUORUM", writeConsistency = "QUORUM", caseSensitiveKeyspace = false, caseSensitiveTable = false)
public class ActiveBid {
    @PartitionKey
    UUID uid;
    @ClusteringColumn
    @Column(name = "username")
    String username;
    @Column(name = "project_name")
    String projectName;
    @Column(name = "project_link")
    String projectLink;
    @Column(name = "total_bid")
    int totalBid;
    @Column(name = "user_bid")
    long userBid;
    @Column(name = "avg_bid")
    long avgBid;
    @Column(name = "end_date")
    Date endDate;

    public ActiveBid(UUID uid, String username, String projectName, String projectLink, int totalBid, long userBid,
            long avgBid, Date endDate) {
        super();
        this.uid = uid;
        this.username = username;
        this.projectName = projectName;
        this.projectLink = projectLink;
        this.totalBid = totalBid;
        this.userBid = userBid;
        this.avgBid = avgBid;
        this.endDate = endDate;
    }

    public UUID getUid() {
        return uid;
    }

    public void setUid(UUID uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getProjectName() {
        return projectName;
    }

    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }

    public String getProjectLink() {
        return projectLink;
    }

    public void setProjectLink(String projectLink) {
        this.projectLink = projectLink;
    }

    public int getTotalBid() {
        return totalBid;
    }

    public void setTotalBid(int totalBid) {
        this.totalBid = totalBid;
    }

    public long getUserBid() {
        return userBid;
    }

    public void setUserBid(long userBid) {
        this.userBid = userBid;
    }

    public long getAvgBid() {
        return avgBid;
    }

    public void setAvgBid(long avgBid) {
        this.avgBid = avgBid;
    }

    public Date getEndDate() {
        return endDate;
    }

    public void setEndDate(Date endDate) {
        this.endDate = endDate;
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(uid, username, projectName, projectLink, totalBid, userBid, avgBid, endDate);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof ActiveBid) {
            ActiveBid that = (ActiveBid) obj;
            return Objects.equal(this.uid, that.uid) && Objects.equal(this.username, that.username)
                    && Objects.equal(this.projectName, that.projectName)
                    && Objects.equal(this.projectLink, that.projectLink) && Objects.equal(this.totalBid, that.totalBid)
                    && Objects.equal(this.userBid, that.userBid) && Objects.equal(this.avgBid, that.avgBid)
                    && Objects.equal(this.endDate, that.endDate);
        }
        return false;
    }

和我的球衣请求映射器以及获取数据的逻辑

@GET
@Path("/get")
@Produces(MediaType.APPLICATION_JSON)
public List<ActiveBid> getTrackInJSON() {
    logger.info("LoginApi: Returning the active bid");
    List<ActiveBid> activeBidList = new ArrayList<ActiveBid>();

    MappingManager manager = new MappingManager(cassDB.getSession());
    ActiveBidAccessor activeBidAccessor = manager.createAccessor(ActiveBidAccessor.class);
    Result<ActiveBid> activeBidResult = activeBidAccessor.getAllByUsersname("zakir");
    for(ActiveBid bid:activeBidResult){
        activeBidList.add(bid);
    }

    return activeBidList;
}

我收到以下错误

原因:java.lang.RuntimeException: Can't create an instance of com.xyz.v1.ActiveBid 在 com.datastax.driver.mapping.ReflectionMapper.newEntity(ReflectionMapper.java:47) 在 com.datastax.driver.mapping.Result.map(Result.java:40) 在 com.datastax.driver.mapping.Result.one(Result.java:87) 在 com.datastax.driver.mapping.Mapper$1.apply(Mapper.java:82) 在 com.datastax.driver.mapping.Mapper$1.apply(Mapper.java:79) 在 com.google.common.util.concurrent.Futures$1.apply(Futures.java:713) 在 com.google.common.util.concurrent.Futures$ChainingListenableFuture.run(Futures.java:861) 在 com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297) 在 com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156) 在 com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145) 在 com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185) 在 com.google.common.util.concurrent.Futures$ChainingListenableFuture$1.run(Futures.java:872) 在 com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297) 在 com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156) 在 com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145) 在 com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:185) 在 com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:174) 在 com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:177) 在 com.datastax.driver.core.RequestHandler.access$2500(RequestHandler.java:43) 在 com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:792) 在 com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:467) 在 com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:1013) 在 com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:936) 在 io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304) 在 io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304) 在 io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304) 在 io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:276) 在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:263) 在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318) 在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304) 在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846) 在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131) 在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) 在 io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) 在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) 在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) 在 io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112) ... 1 更多

有人可以帮我解决这个问题吗,我不知道 Cassandra 会这么难相处。

【问题讨论】:

    标签: java cassandra


    【解决方案1】:

    驱动程序不善于报告异常的原因。 stacktrace points to this

    @Override
    public T newEntity() {
        try {
            return entityClass.newInstance();
        } catch (Exception e) {
            throw new RuntimeException("Can't create an instance of " + entityClass.getName());
        }
    }
    

    不幸的是,它吞下了异常。

    同样,阅读该代码,似乎发生异常是因为您的实体类中没有可访问的无参数构造函数。

    添加一个

    public ActiveBid() {}
    

    here 的文档没有明确说明,但他们的所有示例都使用了这样的构造函数。

    【讨论】:

      【解决方案2】:

      经典问题,您的班级ActiveBid 应该遵守 Java Beans 约定,例如提供一个默认(public & no arg)构造函数

      【讨论】:

        猜你喜欢
        • 2017-06-27
        • 2018-05-06
        • 2013-06-10
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 2020-08-02
        • 2012-09-12
        • 1970-01-01
        相关资源
        最近更新 更多