Java JSF验证器中的NPE
我在JSF验证器中获得了NPE,但找不到导致此问题的原因:Java JSF验证器中的NPE,java,sql,Java,Sql,我在JSF验证器中获得了NPE,但找不到导致此问题的原因: // Validate Datacenter Name public void validateDatacenterName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException { // Original value Object modelVa
// Validate Datacenter Name
public void validateDatacenterName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException
{
// Original value
Object modelValue = ((UIInput) component).getValue();
String oriDCName = modelValue.toString();
String s; // New inserted value
if (value != null && !(s = value.toString().trim()).isEmpty())
{
if (s.length() > 18)
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" Value is too long! (18 digits max)", null));
}
if (ds == null)
{
throw new SQLException("Can't get data source");
}
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs;
String resDCName = null;
try
{
conn = ds.getConnection();
// if componentsstatsid <> edited componentstatsid in jsf -> throw validator exception
ps = conn.prepareStatement("SELECT NAME from COMPONENTSTATS where NAME = ?");
ps.setString(1, s);
rs = ps.executeQuery();
while (rs.next())
{
resDCName = rs.getString(1);
}
if (resDCName != null && (!resDCName.equals(oriDCName) ))
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" '" + s + "' is already in use!", null));
}
}
catch (SQLException x)
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" SQL error!", null));
}
finally
{
if (ps != null)
{
ps.close();
}
if (conn != null)
{
conn.close();
}
}
}
else
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" This field cannot be empty!", null));
}
}
//验证数据中心名称
public void validateDatacenterName(FacesContext上下文、UIComponent组件、对象值)引发ValidatorException、SQLException
{
//原值
对象模型值=((UIInput)组件).getValue();
字符串oriDCName=modelValue.toString();
字符串s;//新插入的值
if(value!=null&&!(s=value.toString().trim()).isEmpty())
{
如果(s.长度()>18)
{
抛出新的ValidatorException(新的FacesMessage)(FacesMessage.SEVERITY_错误,
“值太长!(最多18位)”,空);
}
如果(ds==null)
{
抛出新的SQLException(“无法获取数据源”);
}
连接conn=null;
PreparedStatement ps=null;
结果集rs;
字符串resDCName=null;
尝试
{
conn=ds.getConnection();
//如果componentstatsid在jsf中编辑了componentstatsid->抛出验证程序异常
ps=conn.prepareStatement(“从COMPONENTSTATS中选择名称,其中名称=?”;
ps.setString(1,s);
rs=ps.executeQuery();
while(rs.next())
{
resDCName=rs.getString(1);
}
if(resDCName!=null&(!resDCName.equals(oriDCName)))
{
抛出新的ValidatorException(新的FacesMessage)(FacesMessage.SEVERITY_错误,
““+s+”已在使用中!”,null);
}
}
捕获(SQLException x)
{
抛出新的ValidatorException(新的FacesMessage)(FacesMessage.SEVERITY_错误,
“SQL错误!”,null));
}
最后
{
如果(ps!=null)
{
ps.close();
}
如果(conn!=null)
{
康涅狄格州关闭();
}
}
}
其他的
{
抛出新的ValidatorException(新的FacesMessage)(FacesMessage.SEVERITY_错误,
“此字段不能为空!”;
}
}
当我输入唯一的新值时,我得到NPE。当我输入已经在DB表中找到的值时,我得到…已经在使用代码>
如果(resDCName!=null&(!resDCName.equals(oriDCName)),问题就在这里的某个地方但是我无法解决它。知道如何解决这个问题吗?更改逻辑,如下面的代码所示。我假设您希望resDCname不应等于origDCName
while (rs.next())
{
resDCName = rs.getString(1);
if (resDCName != null && resDCName.equals(oriDCName))
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" '" + s + "' is already in use!", null));
}
}
更改逻辑,如下面的代码所示。我假设您希望resDCname不应等于origDCName
while (rs.next())
{
resDCName = rs.getString(1);
if (resDCName != null && resDCName.equals(oriDCName))
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
" '" + s + "' is already in use!", null));
}
}
在jsf页面的输入中添加required=“true”
怎么样?这不是jsf的问题,只是基本的Java。请删除JSF噪音。将required=“true”
添加到JSF页面的输入中如何?这不是JSF的问题,只是基本Java的问题。请移除JSF噪声。