如何使用Spring Boot BeanWrapper查找多重设置器

时间:2019-03-04 03:22:12

标签: java spring spring-boot kotlin

我在程序包中有一个类Packet.java(无法修改)。

public class Packet implements java.io.Serializable, Cloneable {

   private static final AtomicLong ID_ATOMICLONG = new AtomicLong();

   private Long id = ID_ATOMICLONG.incrementAndGet();
}

我使用自己的类LoginPacket.kt(可以修改)

class LoginPacket : Packet () {
   var id = "" ( this name must be id )
   fun parsePacket(input: String): Boolean {
    val map = HashMap<String,Any>()
    map["id"] = "5d6ff3433354b4d43076419"
    var wrapper: BeanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(this)
    wrapper.isAutoGrowNestedPaths = true
    // question is here , I can not set id as String use BeanWrapper, Only can set id as Long
    // and also I can replace id's getter and setter method
    val pd = wrapper.getPropertyDescriptor("id")
    pd.readMethod = LoginPacket::id.getter.javaMethod
    pd.writeMethod = LoginPacket::id.setter.javaMethod
    wrapper.setPropertyValues(map)
   }
}

那我下一步该怎么做?

非常感谢分享!

Beanwrapper link

1 个答案:

答案 0 :(得分:0)

无法覆盖字段类型。

您可以执行的操作取决于您要执行的操作以及所使用的库。

我可以想到一种可行的方法,假设您的库不需要实例或Packet的子类。 那就是创建您自己的仅实现接口的类:

class LoginPacket(): java.io.Serializable, Cloneable {

   // You may or may not need this.
   // Since the original version uses it to generate the ID, 
   // I think you can skip this part.
   companion object {
       @JvmStatic
       private val ID_ATOMICLONG = AtomicLong()   
   }

   var id : String = ""

   fun parsePacket(input: String): Boolean {
       val map = HashMap<String,Any>()
       map["id"] = "5d6ff3433354b4d43076419"
       var wrapper: BeanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(this)
       wrapper.isAutoGrowNestedPaths = true
       val pd = wrapper.getPropertyDescriptor("id")
       pd.readMethod = LoginPacket::id.getter.javaMethod
       pd.writeMethod = LoginPacket::id.setter.javaMethod
       wrapper.setPropertyValues(map)
   }
}

在没有更多上下文的情况下很难提供更好的答案。