正确测试可选字段值的方法

时间:2011-09-30 05:56:35

标签: java playframework optional

在我的应用程序中使用playframework编写方法时,我需要获取Address字段的用户输入并搜索db以查找匹配的字段。如果找不到匹配的地址,我必须创建一个新的地址。

此处只有addressLine1country是必填字段。 用户可以忽略addressLine2。

从html表单中获取输入时,可选字段的textfields返回一个空字符串。因此,为了测试Address的创建,我决定创建一个Map<String,String>来传递给POST方法.. 我试过了

addrparams = new Map<String,String>();
addrparams.put("addressline1","clayton st");
addrparams.put("country","US");

当jpql查询尝试为缺少的选项字段绑定映射的值时,这会导致nullpointer异常。

String query="select distinct a from Address a where a.addressLine1=:addressline1 and a.addressLine2=:addressline2 and a.country=:country";
Address address = Address.find(query).bind("addressline1",addressline1).bind("addressline2",addressline2).bind("country", country).first();
            ..

我通过为所有可选字段添加空字符串来解决这个问题

addrparams = new Map<String,String>();
addrparams.put("addressline1","clayton st");
addrparams.put("addressline2","");
addrparams.put("country","US");

我希望这是正确的方法。如果有人能指出更好的方法来测试这种情况,那对我有很大的帮助

地址类

@Entity
public class Address extends Model {    
    @Required
    String addressLine1;    
    String addressLine2;        
    @Required
    String country;
...
} 

更新 堆栈跟踪是here

发生nullptr异常的Account.java:207就是这一行

Address address = Address.find(query).bind("addressline1",addressline1).bind("addressline2",addressline2).bind("country", country).first();

1 个答案:

答案 0 :(得分:1)

您的查询错误。你错过了where子句中的别名和等号:

where a.addressline1 = :addressline1 ...

您构建地图的方式也是错误的。你把“clayton st”作为addressline1,然后用空字符串替换它。

如果这些更正不起作用,请编辑您的问题,粘贴异常的堆栈跟踪,并告诉我们代码中的哪一行会抛出它。