私はクラスキャストで少し苦労しています。シーンを設定しましょう。私はサービスとオーケストレーター層を使用するJavaサーバーコードを持っています。要求は、Bean形式(フロントエンドビューに合わせたJavaクラス)のサービスレイヤーに入ってきます。次に、Beanフォーマットオブジェクトを取得し、それをドメイン形式オブジェクトに変換するdomainBeanMapperクラスの束があります。たとえば、UserBeanには文字列で表されるdateOfBirthがあり、UserにはDateOfBirthがDateで表されるため、UserMapper.javaは日付文字列を日付オブジェクトにします。したがって、システム内の各オブジェクトには、* .java、* Bean.java、* Mapper.java(User.java、UserBean.java、userMapper.java)があります。 ApplicationContextの中Java - インターフェイスにキャストし、キャストされたタイプが何であるかを調べる
私はこのように、彼らのマッパーへの各オブジェクトからの関係を保持する:
<util:map id="domainBeanMappers">
<entry key="UserBean" value-ref="userMapper" />
<entry key="User" value-ref="userMapper" />
.....
、その後、私はマッパーを定義します。
<bean id="userMapper" class="com.me.mapping.UserMapper" parent="baseDomainBeanMapper"/>
私はこのようなドメイン豆マッパーから呼び出します私のサービス層:
UserBean userBean = (UserBean) getDomainBeanMapper().mapDomainToBean(user);
このコードを実行すると、私はマッパーobje私はこのようにしたいCT:findApplicableMapperはこのように動作します
DomainBeanMapper mapper = findApplicableMapper(myObject.getClass().getName());
if (mapper == null) {
mapper = findApplicableMapper(myObject.getClass().getSimpleName());
}
:過去数年間
private DomainBeanMapper findApplicableMapper(String string) {
return domainBeanMappers.get(string);
}
が、これは魅力のように働いています。どのようなオブジェクトであれ、私は簡単に関連するマッパーを選択してから、どのインスタンスの.getClass()呼び出しに基づいて、自分のbean形式からドメイン形式に変換したり、その逆に変換することができます。
今、私は困っている新しい要件があります。私はUserオブジェクトからパラメータに基づいていくつかのサブオブジェクトに変換できるようにしたい。だから、いくつかの呼び出しでは、私はid、firstNameとlastNameだけ戻ってほしいです。他の呼び出しでは、より多くのフィールドを必要としますが、オブジェクト全体ではありません。いくつかの呼び出しでは、前と同じようにオブジェクト全体を元に戻します。私は、サブオブジェクトのパスを下って、UserLight、UserLightWithName、UserLightWithNameButNoAddress、... arghの悪夢で終わることは望んでいません。
代わりに、私は "ビュー"を表す一連のインタフェースを作成したいと考えていました。したがって、リクエストはViewTypeのBasicで提供されます。つまり、ユーザーの個人情報と住所が必要です。だから私は、私はこのような変換コール作ることができることを期待して、UserBasicと呼ばれるインタフェースを書いて、それを実装するためにユーザーを持って、そしてUserBasicMapperにUserBasicからのマッピングを追加し、UserBasicBeanからUserBasicMapperへ:
UserBasicBean restrictedUserReturn = (UserBasicBean) getDomainBeanMapper().mapDomainToBean((UserBasic)user);
をが、これは動作しません。なぜなら、getClass()は、キャストされたインタフェースではなく、インスタンスクラスを常に返します。私はいつも私が使用したいクラスであるmapDomainToBeanコールに別のパラメータを追加することができますが、コードベースは非常に大規模で、その変更を行う場合はすべての呼び出しに触れる必要があります。
基本的に私は、インターフェイスタイプにインスタンスをキャストし、そのインターフェイスタイプを見つける方法を探していますか?これは可能ですか?
十字指 ...
なぜオブジェクト全体が必要なのですか? –
セキュリティ要件です。システムの特定のユーザは、オブジェクトの特定の部分だけを見ることができます。 – Margaret