Я встречаю эту проблему в эти дни. И в соответствии с моим устранением неполадок, это вызвано различным значением возврата этого метода:
sun.misc.VM.latestUserDefinedLoader()
Ранее (до 8u171) этот метод возвращает sun.misc.Launcher$ExtClassLoader
, в то время как он возвращает загрузчик классов приложения после обновления. В ObjectInputStream оба загрузчика классов могут успешно загружать com.sun.crypto.provider.SealedObjectForKeyProtector
, это просто потому, что ExtClassLoader является родителем загрузчика классов приложения (или родителем родителя). Однако, как только SealedObjectForKeyProtector загружен загрузчиком классов приложения, его загрузчик классов больше не равен ExtClassLoader.
С другой стороны, в пределах com.sun.crypto.provider.JceKeyStore
, в отличие от ObjectInputStream
, SealedObjectForKeyProtector
всегда загружается ExtClassLoader. Таким образом, проверка ниже JceKeyStore.java: 932 завершится сбоем из-за того, что класс не равен:
932 if (info.serialClass() != SealedObjectForKeyProtector.class))
934 return Status.REJECTED;
Тогда, в конце концов, мы получим ниже log и IOException:
ObjectInputFilter
ОТКАЗАНО: класс com.sun.crypto.provider.SealedObjectForKeyProtector
Решение: убедитесь, что класс com.sun.crypto.provider.SealedObjectForKeyProtector
не загружен ContextClassLoader с определенной конфигурацией. Детали зависят от ContextClassLoader. Например, для org.powermock.core.classloader.MockClassLoader
конкретное решение добавляет добавленную ниже аннотацию к участвующим тестовым классам:
@PowerMockIgnore("com.sun.*")