【问题标题】:Spring property binding with Proguard使用 Proguard 绑定 Spring 属性
【发布时间】:2017-05-17 02:27:42
【问题描述】:

我使用 Proguard 混淆了以下 Spring 配置类。我在下面给出了我使用的 Proguard 选项。该类应绑定到属性文件中名为 http.cache.timeToLiveInDays 的属性。

@ConfigurationProperties(prefix = "onboarding", ignoreUnknownFields = false)
public class OnboardingProperties {
    private final Http http = new Http();

    public Http getHttp() {
        return http;
    }

    public static class Http {
        private final Cache cache = new Cache();

        public Cache getCache() {
            return cache;
        }

        public static class Cache {
            private int timeToLiveInDays = 1461;

            public int getTimeToLiveInDays() {
                return timeToLiveInDays;
            }
            public void setTimeToLiveInDays(final int timeToLiveInDays) {
                this.timeToLiveInDays = timeToLiveInDays;
            }
        }
    }
}

属性文件application.yml包含以下内容,

onboarding:
    http:
        cache:
            timeToLiveInDays: 1234

Proguard 配置,

-injars ../$FINAL_NAME$/WEB-INF/lib/$FINAL_NAME$.jar

-outjars ./

-dontoptimize
# -dontshrink
# -dontusemixedcaseclassnames
# -dontpreverify
-verbose
-printseeds seeds.txt

-optimizations !class/marking/final

-adaptresourcefilenames **.properties
-adaptresourcefilecontents **.properties,META-INF/MANIFEST.MF

-keep public class com.test.blah.OnboardingApp {
  public static void main(java.lang.String[]);
}
-keep public class * extends org.springframework.boot.web.support.SpringBootServletInitializer

-keep class com.test.blah**.dto.** {
  void set*(***);
  *** get*();
}

-keep public class com.test.blah.config.OnboardingProperties
-keep public class com.test.blah.config.OnboardingProperties$* {
  *;
}

-keep class org.springframework.**
-keep class liquibase.**
-keep interface org.springframework.**
-keep interface liquibase.**

-keepclassmembers class * {
  @org.springframework.beans.factory.annotation.Autowired *;
  @org.springframework.beans.factory.annotation.Qualifier *;
  @org.springframework.beans.factory.annotation.Value *;
  @org.springframework.beans.factory.annotation.Required *;
  @org.springframework.context.annotation.Bean *;
  @org.springframework.context.annotation.Primary *;
  @org.springframework.boot.context.properties.ConfigurationProperties *;
  @javax.inject.Inject *;
  @javax.annotation.PostConstruct *;
  @javax.annotation.PreDestroy *;
}

-keep @org.springframework.stereotype.Service class *
-keep @org.springframework.stereotype.Controller class *
-keep @org.springframework.stereotype.Component class *
-keep @org.springframework.stereotype.Repository class *
-keep @org.springframework.context.annotation.Configuration class *
-keep @org.springframework.web.bind.annotation.ControllerAdvice class *
-keep @org.springframework.boot.context.properties.ConfigurationProperties class *
-keep @org.springframework.boot.autoconfigure.SpringBootApplication class *

-allowaccessmodification
-keepattributes Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,Synthetic,EnclosingMethod
-keepattributes *Annotation*
-keepattributes Signature
-keepattributes Exceptions
-keepattributes InnerClasses

-keepparameternames
-keepdirectories

-keepclassmembernames class * {
  java.lang.Class class$(java.lang.String);
  java.lang.Class class$(java.lang.String, boolean);
}

-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
  public static ** fromValue(java.lang.String);
}

-keepnames class * implements java.io.Serializable

-keepclassmembers class * implements java.io.Serializable {
  static final long serialVersionUID;
  private static final java.io.ObjectStreamField[] serialPersistentFields;
  !static !transient <fields>;
  !private <fields>;
  !private <methods>;
  private void writeObject(java.io.ObjectOutputStream);
  private void readObject(java.io.ObjectInputStream);
  java.lang.Object writeReplace();
  java.lang.Object readResolve();
}

不幸的是,当它尝试绑定到属性时,我似乎遇到了以下错误。

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'http[cache][timeToLiveInDays]' of bean class [com.test.blah.config.OnboardingProperties]: Cannot access indexed value in property referenced in indexed property path 'http[cache][timeToLiveInDays]'; nested exception is org.springframework.beans.NotReadablePropertyException: Invalid property 'http[cache][timeToLiveInDays]' of bean class [com.test.blah.config.OnboardingProperties]: Bean property 'http[cache][timeToLiveInDays]' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyHoldingValue(AbstractNestablePropertyAccessor.java:405)
    at org.springframework.beans.AbstractNestablePropertyAccessor.processKeyedProperty(AbstractNestablePropertyAccessor.java:298)
    at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:289)
    at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:280)
    at org.springframework.boot.bind.RelaxedDataBinder$RelaxedBeanWrapper.setPropertyValue(RelaxedDataBinder.java:699)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95)
    at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:859)
    at org.springframework.validation.DataBinder.doBind(DataBinder.java:755)
    at org.springframework.boot.bind.RelaxedDataBinder.doBind(RelaxedDataBinder.java:128)
    at org.springframework.validation.DataBinder.bind(DataBinder.java:740)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:272)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:240)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:329)
    ... 70 more
Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'http[cache][timeToLiveInDays]' of bean class [com.test.blah.config.OnboardingProperties]: Bean property 'http[cache][timeToLiveInDays]' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyValue(AbstractNestablePropertyAccessor.java:633)
    at org.springframework.beans.AbstractNestablePropertyAccessor.getPropertyHoldingValue(AbstractNestablePropertyAccessor.java:402)
    ... 82 more

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: java spring spring-boot proguard


    【解决方案1】:

    我设法解决了这个问题,

    -keep public class com.test.blah.config.OnboardingProperties {
      private <fields>;
      *** get*();
    }
    -keep class com.test.blah.config.OnboardingProperties$* {
      private <fields>;
      void set*(***);
      *** get*();
    }
    

    而不是,

    -keep public class com.test.blah.config.OnboardingProperties
    -keep public class com.test.blah.config.OnboardingProperties$* {
      *;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-14
      • 2011-08-18
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      相关资源
      最近更新 更多