beanwrapperimplは、WebSphereでのみ発行されます
-
27-10-2019 - |
質問
私たちの違いは開発者と私たちの地元のものとは異なりました
当社のアプリケーションは、Springバージョン3.1.0リリースでSpring-Securityを使用しています。
JSPファイルから始まり、接続されたユーザー名を表示しようとしています。
Devには、NoteadablePropertyExceptionがあります。「Bean Property 'Principal'は読み取りできないか、無効なゲッター方法があります。
これは、AuthenticationTagがBeanWrapper(BeanWrapperimpl)を使用しているためです
ファイルBeanWrapperimplの729行(スプリング3.1.0リリース)では、エラーがスローされます。
727:PropertyDescriptor pd = getCachedIntrospectionResults().getPropertyDescriptor(actualName);
728:if (pd == null || pd.getReadMethod() == null) {
729: throw new NotReadablePropertyException(getRootClass(), this.nestedPath + propertyName);
730:}
したがって、PDはnullまたはpd.getReadMethod()がnullです。通常の場合、getReadMethodこれはこれを返します:オブジェクトメソッド[public java.lang.object org.springframework.security.authentication.usernamepasswordawordawordainticationtoken.getprincipal()
アップデートクラスにいくつかのログをデバッグして追加した後、「PD」はnullのようです
エラーを識別するために、このコードをPure Javaに書きました
logger.info(session.getAttribute("SPRING_SECURITY_CONTEXT").getClass().toString());
final SecurityContextImpl sci = ((SecurityContextImpl) session.getAttribute("SPRING_SECURITY_CONTEXT"));
logger.info(sci.getAuthentication().getClass().toString());
final Authentication auth = sci.getAuthentication();
logger.info(auth.getPrincipal().getClass().toString());
final User u = (User) auth.getPrincipal();
logger.info(u.getUsername());
logger.info(SecurityContextHolder.getContext().getAuthentication().getName());
logger.info("use beanWrapper :");
final BeanWrapperImpl wrapper = new BeanWrapperImpl(auth);
String property = "principal";
Object result = wrapper.getPropertyValue(property);
logger.info("property : " + property + " value :[" + result.toString() + "]");
property = "principal.username";
result = wrapper.getPropertyValue(property);
logger.info("property : " + property + " value :[" + result.toString() + "]");
私たちのログオン私たちはdevにありました:
[2012-01-12 12:23:19,843] INFO [WebContainer : 8] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.context.SecurityContextImpl
[2012-01-12 12:23:19,843] INFO [WebContainer : 8] [c.b.e.e.w.c.IndexController] class org.springframework.security.authentication.UsernamePasswordAuthenticationToken
[2012-01-12 12:23:19,843] INFO [WebContainer : 8] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.userdetails.User
[2012-01-12 12:23:19,843] INFO [WebContainer : 8] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-12 12:23:19,843] INFO [WebContainer : 8] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-12 12:23:19,843] INFO [WebContainer : 8] [c.b.e.e.w.c.IndexController] use beanWrapper :
<500エラー>
私たちの地元のログは次のとおりです。
[2012-01-13 08:51:10,062] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.context.SecurityContextImpl
[2012-01-13 08:51:10,062] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] class org.springframework.security.authentication.UsernamePasswordAuthenticationToken
[2012-01-13 08:51:10,062] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] class org.springframework.security.core.userdetails.User
[2012-01-13 08:51:10,062] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-13 08:51:10,073] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] superadmin
[2012-01-13 08:51:10,073] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] use beanWrapper :
[2012-01-13 08:51:10,095] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] property : principal value :[org.springframework.security.core.userdetails.User@99ac08b4: Username: superadmin; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: SuperAdmin]
[2012-01-13 08:51:10,095] INFO [WebContainer : 4] [c.b.e.e.w.c.IndexController] property : principal.username value :[superadmin]
私たちはdevにありましたフルバージョンです、
私たちのローカルは軽い、無料の開発者バージョンです
アップデート
回避策をコーディングしてユーザー名を取得した後、問題はさらに進行中に発生しますが、それでもbonwrapperimplで発生します
org.springframework.beans.NotReadablePropertyException: Invalid property 'codeAndName' of bean class [com.data.model.Country]: Bean property 'codeAndName' 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.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:729)
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:721)
at org.springframework.web.servlet.tags.form.OptionWriter.doRenderFromCollection(OptionWriter.java:216)
at org.springframework.web.servlet.tags.form.OptionWriter.renderFromCollection(OptionWriter.java:186)
at org.springframework.web.servlet.tags.form.OptionWriter.writeOptions(OptionWriter.java:139)
at org.springframework.web.servlet.tags.form.OptionsTag.writeTagContent(OptionsTag.java:169)
アップデート 2 :
問題はより孤立しています:Spring Securityの依存せずに、SpringMVCのみ、
beanwrapperに置かれた場合、ゲッターに対応するセッターがない場合、devでのみ読み取り可能なpropertyexceptionを投げます。
セッターがあるとき、問題はありません。クラスのusernamepasswordauthenticationtokenは、spring security.classのクラスであると仮定します。
解決
見つかった1つの解決策:
問題は、拡張beaninfo inf spring3.1の導入によるものです
...
したがって、解決策は、以前のバージョンのcachedintropectionResultsを取得し、上書きされるようにパッケージ「org.springframework.beans」に置くことです。
ただし、アプリケーションクラスパスが最初に取られることを確認する必要があります。
他のヒント
BeanWrapperを使用してネストされたプロパティを設定しようとしたとき、私は同じ問題を抱えていました。問題は、セッターが必要だとは思わなかったにもかかわらず、プロパティにはセッターがなかったということでした。セッターを追加すると、私の問題が修正されました。 Benoitのアップデートを提供してくれてありがとう!私の豆:
public class Bean {
private InnerBean innerBean = new InnerBean();
public InnerBean getInnerBean() {
return this.innerBean;
}
}
失敗していた私のBeanWrapperコード:
BeanWrapper wrapper = new BeanWrapperImpl(new Bean());
wrapper.setPropertyValue("innerBean.property","some value");