Tapestry错误:#does不包含autobuild所需的公共构造函数

时间:2018-02-24 17:29:42

标签: java database interface tapestry

我在通过列表显示来自Mysql数据库的一些评论时遇到问题
错误:
在SetupRender中呈现队列错误[详细信息:网格]:读取组件的参数“source”失败详细信息:grid:类com.mycompany.licenta.data.InterfataRecenzii不包含autobuild所需的公共构造函数。

有人能帮我说出这个有什么不对吗? 我希望这是可以理解的。

我的项目中还有另一个界面来显示我的数据库中的其他东西(并且所有都在同一个包中/但即使我把它放在其他包中,错误仍然是相同的)。那可以吗?


我的列表类代码是:

package com.mycompany.licenta.datarecenzii;
import com.mycompany.licenta.datarecenzii.Recenzie;
import com.mycompany.licenta.datarecenzii.InterfataRecenzii;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ListaRecenzii implements InterfataRecenzii{

private List<Recenzie> recenzii = new ArrayList<Recenzie>();

 public ListaRecenzii()
{
    //preluare recenzii din baza de date
     String flag="";
    String jndiname="jdbc/TestDB";
    DataSource dataSource=null;
    try{
        dataSource=(DataSource) new InitialContext().lookup("java:comp/env/" + jndiname);
        Connection con=dataSource.getConnection();
        Statement stm=con.createStatement();
        ResultSet rs=stm.executeQuery("select * from recenzii");
        ResultSetMetaData rsmd=rs.getMetaData();
        while(rs.next())
            {
                Recenzie recenzie=new Recenzie(rs.getInt("idhotel"),rs.getString("numeRecenzor"),rs.getInt("nivelIncredere"),rs.getString("recenzie"));
                   recenzii.add(recenzie);

            }


    }catch (Exception e){flag+=e.toString();}
    if (dataSource!=null)
        flag+="succes";

   // addRecenzie(new Recenzie(6, "mihai",8,"Vega este un hotel de 5 stele din Mamaia"));

}
public List<Recenzie> getAllRecenzii()
{
return recenzii;
}
public Recenzie getRecenzieByIdRecenzie(int idRecenzie)
{
for (Recenzie r : recenzii)
{
if (r.getIdRecenzie() == idRecenzie) return r;
}
return null;
}
public void addRecenzie(Recenzie r)
{
int newIdRecenzie = recenzii.size();
r.setIdRecenzie(newIdRecenzie);
recenzii.add(r);
}
}


我的界面:

<pre>package com.mycompany.licenta.datarecenzii;

import java.util.List;
public interface InterfataRecenzii {

    List<Recenzie> getAllRecenzii();
 Recenzie getRecenzieByIdRecenzie(int idRecenzie);
 void addRecenzie(Recenzie r);
}


我将在页面类中显示带有评论的列表:

 package com.mycompany.licenta.pages;

import com.mycompany.licenta.data.IDataSource;
import com.mycompany.licenta.data.Hotel;
import com.mycompany.licenta.data.Hotel;
import com.mycompany.licenta.data.IDataSource;
import com.mycompany.licenta.datarecenzii.InterfataRecenzii;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.SessionState;
import com.mycompany.licenta.datarecenzii.Recenzie;
import java.util.List;

public class Details {
    @SessionState
    private IDataSource dataSource;
    private Hotel hotel;


    @SessionState
    private InterfataRecenzii dataSources;
    private Recenzie recenzie;

public void setHotel(Hotel c)
{
this.hotel = c;
}
public Hotel getHotel()
{
return hotel;
}
void onActivate(long id)
{
hotel = dataSource.getHotelById(id);
}


public List<Recenzie> getAllRecenzii()
{
    return dataSources.getAllRecenzii();
}


public Recenzie getRecenzie()
{
return recenzie;
} 
public void setRecenzie(Recenzie recenzie)
{
this.recenzie = recenzie;
}
}


将显示它的tml页面组件

<t:grid t:source="allRecenzii" rowsPerPage="2" row="recenzie">
    </t:grid>

1 个答案:

答案 0 :(得分:1)

您无法@SessionState接口,因为在从会话中读取字段时,tapestry将不知道要实例化哪个实现类。 尝试更换:

@SessionState
private InterfataRecenzii dataSources;

使用:

@SessionState
private ListaRecenzii dataSources;

此外,您可以避免在Details.java中编写getRecenzi()setRecenzii(Recenzii)的样板,只需将@Property添加到Recenzii字段,然后.tml就可以访问它。