Tapestry error: #does not contain a public constructor needed to autobuild
Tapestry error: #does not contain a public constructor needed to autobuild
我在通过列表显示来自 Mysql 数据库的一些评论时遇到问题
错误:
SetupRender[Details:grid] 中的渲染队列错误:组件 Details:grid 的读取参数 'source' 失败:Class com.mycompany.licenta.data.InterfataRecenzii 不包含需要的 public 构造函数自动构建。
谁能帮我说说这是哪里出了问题?
我希望这是可以理解的。
我的项目中还有另一个界面,用于显示我数据库中的其他内容(并且所有内容都在同一个包中/但即使我将其放入其他包中,错误仍然相同) .可以吗?
我的 class 列表代码是:
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);
}
我将在其中显示评论列表的页面 class :
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>
您不能 @SessionState
接口,因为 Tapestry 在从会话中读取字段时不知道要实例化哪个实现 class。
尝试替换:
@SessionState
private InterfataRecenzii dataSources;
有:
@SessionState
private ListaRecenzii dataSources;
您还可以避免在 Details.java 中编写 getRecenzi()
和 setRecenzii(Recenzii)
的样板,只需将 @Property
添加到 Recenzii
字段和 .tml将可以访问它。
我在通过列表显示来自 Mysql 数据库的一些评论时遇到问题
错误:
SetupRender[Details:grid] 中的渲染队列错误:组件 Details:grid 的读取参数 'source' 失败:Class com.mycompany.licenta.data.InterfataRecenzii 不包含需要的 public 构造函数自动构建。
谁能帮我说说这是哪里出了问题?
我希望这是可以理解的。
我的项目中还有另一个界面,用于显示我数据库中的其他内容(并且所有内容都在同一个包中/但即使我将其放入其他包中,错误仍然相同) .可以吗?
我的 class 列表代码是:
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);
}
我将在其中显示评论列表的页面 class :
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>
您不能 @SessionState
接口,因为 Tapestry 在从会话中读取字段时不知道要实例化哪个实现 class。
尝试替换:
@SessionState
private InterfataRecenzii dataSources;
有:
@SessionState
private ListaRecenzii dataSources;
您还可以避免在 Details.java 中编写 getRecenzi()
和 setRecenzii(Recenzii)
的样板,只需将 @Property
添加到 Recenzii
字段和 .tml将可以访问它。