【问题标题】:how to find multi setter with Spring Boot BeanWrapper如何使用 Spring Boot BeanWrapper 查找 multi setter
【发布时间】:2019-03-04 03:22:11
【问题描述】:

我在包中有一个类 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

【问题讨论】:

    标签: java spring spring-boot kotlin


    【解决方案1】:

    无法覆盖字段的类型。

    您可以做什么取决于您想要做什么,以及您正在使用哪些库。

    我可以想到一种可行的方法,假设您的库不需要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)
       }
    }
    

    如果没有更多上下文,很难提供更好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 2023-03-05
      • 2020-01-25
      相关资源
      最近更新 更多