6.4.20 JBossパッチ の後に使用されているJacksonのバージョンを更新しようとしています。私はorg.codehause.jackson
を使用しており、JBoss 6.4.xは、私が知る限り、新しいcom.fasterxml.jackson
の暗黙的な依存関係を提供していません。
jackson-mapper-asl-1.9.9.redhat-6
が このパッチ に使用できる有効なパッケージであると想定することは適切ですか? 6.4.20アナウンスメント のnoarchセクションまでスクロールすると、codehaus-jackson-mapper-asl-1.9.9-12.redhat_6
が表示されます。これは推奨バージョンであることを意味しますか? 18/05/14にリリースされ、05/15/18に発表されたことがわかります。
codehause-jackson-mapper-asl
はfasterxml-jackson-databind
に関連付けられているため、現在次のエラーが発生しています。これは、間違ったバージョンを使用していると思わせる原因になります。
16:01:22,620エラー[org.jboss.resteasy.resteasy_jaxrs.i18n](http-127.0.0.1:8080-1)RESTEASY000100:実行に失敗しましたPOST/find:org.jboss.resteasy .spi.ReaderException:
org.codehaus.jackson.map.JsonMappingException:逆シリアル化する不正なタイプ[...]:セキュリティ上の理由により防止
[...]
原因:org.codehaus.jackson.map.JsonMappingException:不正なタイプ[...]が非直列化されます:org.codehaus.jackson.map.deser.BeanDeserializerFactory.checkLegalTypes(BeanDeserializerFactory.Java:1521)でセキュリティ上の理由により防止されました[jackson -mapper-asl-1.9.9.redhat-6.jar:1.9.9.redhat-6] `
最近JBoss EAP 6.3.0から6.4.20にアップグレードしましたが、同じ例外がありました。
例外のスタックトレースをたどると、システムプロパティjackson.deserialization.whitelist.packages
に、逆シリアル化するクラスの完全なクラス名を設定する必要があることがわかりました。
必要に応じて、パッケージのサフィックスのみを指定できます。複数の値の場合は、コンマで区切ります。これは、38行目から45行目のjackson-mapper-asl-1.9.9.redhat-6.jar
クラスorg.codehaus.jackson.map.deser.BeanDeserializerFactory
で確認できます。
JBoss環境では、次のようにstandalone*.xml
またはdomain.xml
でシステムプロパティを定義できます。
<system-properties>
<property name="jackson.deserialization.whitelist.packages" value="br.com.myapp" />
</system-properties>
@MhagnumDwの答えに基づいて、JBoss 6.4.20パッチでも同じエラーが発生し、このソリューションを使用しました。これが https://maven.repository.redhat.com/techpreview/all/org/codehaus/jackson/jackson-mapper-asl/1.9.9.redhat-6/jacksonからのソースコード関連のソースコードです。 -mapper-asl-1.9.9.redhat-6-sources.jar org.codehaus.jackson.map.deser.BeanDeserializerFactory内;
/**
* @since 1.9.9.redhat-5
*/
protected void checkLegalTypes(DeserializationConfig config, JavaType type,
BeanDescription beanDesc)
throws JsonMappingException
{
// There are certain nasty classes that could cause problems, mostly
// via default typing -- catch them here.
String full = type.getRawClass().getName();
Iterator<String> iter = _cfgLegalPackageNames.iterator();
boolean pass = false;
while(iter.hasNext()) {
if(full.startsWith(iter.next())) {
pass = true;
break;
}
}
if(!pass) {
throw new JsonMappingException(
String.format("Illegal type (%s) to deserialize: prevented for security reasons", full));
}
}
Full.startsWith(iter.next())は、上位レベルのパッケージ名をホワイトリストに追加できることを示しています。例えば、
<system-properties>
<property name="jackson.deserialization.whitelist.packages" value="br.com.myapp" />
</system-properties>
ホワイトリストbr.com.myapp.package.aclass
およびbr.com.myapp.package.bclass