问题描述
Pojo 课程
case class RulePojoMigration(val tolerance_id:Int,val asset_id:Int,measure: String,cond: String,function: String,threshold_value: String,rule_dts: String,filter: util.List[Filter],is_enabled: String,mode: String,tolerance_status: String,action_key: String,email_ids: util.List[String],rule_name:String,rule_owner:String,group_by: util.List[String],relax_variation_band:String,reconciliation_id:Int)
case class Filter(value: String,operator: String,dimension: String)
Below is the code used to fetch the object from DB
if (checkRuleIsEditOrNot) {
ps = con.prepareStatement(WSQueryConstant.RULE_MIGRATION_GET_COMPLETE_RULE_INFO_FROM_STAGE)
ps.setInt(1,rulePojo.tolerance_id)
rs = ps.executeQuery
var dbRulePojo: RulePojoMigration = null
val jsonRulePojo: RulePojoMigration = rulePojo
if (rs.next()) {
val rule_tolerance_asset_id = rs.getInt(2)
val measure = rs.getString(3)
val cond = rs.getString(4)
val function = rs.getString(5)
val threshold_value = rs.getString(6)
val rule_dts = rs.getString(7)
val filter = gson.fromJson(rs.getString(8),classOf[util.List[Filter]])
val is_enabled = rs.getString(9)
val mode = rs.getString(10)
val tolerance_status = rs.getString(11)
val email_ids = gson.fromJson(rs.getString(12),classOf[java.util.List[String]])
val rule_name = rs.getString(13)
val rule_owner = rs.getString(14)
val group_by = gson.fromJson(rs.getString(15),classOf[java.util.List[String]])
val relax_variation_band = rs.getString(16)
var reconciliation_id = rs.getString(17)
if(reconciliation_id== null)
reconciliation_id= "-1"
dbRulePojo = RulePojoMigration(jsonRulePojo.tolerance_id,rule_tolerance_asset_id,measure,cond,function,threshold_value,rule_dts,filter,is_enabled,mode,tolerance_status,jsonRulePojo.action_key,email_ids,rule_name,rule_owner,group_by,relax_variation_band,reconciliation_id.toInt)
-
具有以下值的用户请求。
RulePojoMigration(1274,1234,*,less than,count,100,2020-07-04 05:31:29,[Filter(Hello,equal,funnel_state)],1,static,null,EMAIL,[x],StaticruleMigrationTesting,email,[ALL],-1)
-
RulePojoMigration(1274,[{value=Hello,operator=equal,dimension=funnel_state}],-1)
所以我想检查两个对象的相等性,以便用户可以在有效负载发生任何更改时修改现有对象,或者只是他/她应该收到一条消息,说明存在重复条目。 jsonRulePojo.equal(dbRulePojo)
应该是真的,无论如何,两个对象的值都是相同的。
解决方法
默认的 equals
操作不检查两个类的内容,它只检查两个值是否引用同一个对象。因此,即使每个字段都相同,RulePojoMigration
的两个实例也将始终不同。默认情况下,两个类只有在它们是同一个实例时才相等。
当定义了 case class
时,Scala 将生成一个 equals
,它会依次检查传递给构造函数的每个字段。因此,如果两个 case classe
具有相同的内容,则它们将相等。
因此您可以通过以下两种方式之一修复此代码:
- 使
RulePojoMigration
成为case class
- 将
equals
方法添加到RulePojoMigration
我可以通过进行以下更改来解决该错误。
From
val filter = gson.fromJson(rs.getString(8),classOf[util.List[Filter]])
To
val filter = gson.fromJson(rs.getString(8),classOf[Array[Filter]])
和
dbRulePojo = RulePojoMigration(jsonRulePojo.tolerance_id,rule_tolerance_asset_id,measure,cond,function,threshold_value,rule_dts,java.util.Arrays.asList(filter:_*),is_enabled,mode,tolerance_status,jsonRulePojo.action_key,email_ids,rule_name,rule_owner,group_by,relax_variation_band,reconciliation_id.toInt)
而不是将 filter
直接传递给 dbRulePojo
我传递了 java.util.Arrays.asList(filter:_*)