You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-user-ja@ws.apache.org by FUJIMOTO Jun <j-...@nsg-kk.co.jp> on 2005/07/13 04:18:56 UTC

desreializer

初めまして 藤本と申します

AXISの勉強をしていて,シリアライザとデシリアライザを自分で
定義してみようと思いましたが以下のような場合についての
簡単なサンプルを提示していただけませんか

1.クラスBarとクラスBazにはシリアライザとデシリアライザが
定義されている.
2.クラスFooはFoo(Bar bar, Baz baz)というpublicなコンストラクタ
を持つがインスタンスフィールドにはBarとBazを持たない.
3.Fooはデフォルトコンストラクタを持たない.

このような場合FooのデシリアライザをBarとBazのデシリアライザ
を利用して定義するには?

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by Toshiyuki Kimura <to...@apache.org>.
 木村です。

 上手くいったようで何よりです。

 シリアライザは、APIを使ってもWSDDを使ってもどちらでも
正しく設定していれば問題なく無く動作します。藤本さんの
場合は、WSDDのtypeMappingの指定が誤っていたのですが、
APIを使ったシリアライザの登録も重複して実施しているため
たまたま動作しているような状況だと推測します。

 やはり正しくWSDDを記載し、AdminClientを使ったデプロイ
を行うことをお勧めします。(server-config.wsddの直接編集
は、さまざまな問題を引き起こす可能性があるため、なれる
までできるだけ避けたほうが良いと思います。)

---
Toshi <to...@apache.org>

On Fri, 22 Jul 2005, FUJIMOTO Jun wrote:

> 今原因がわかりました.
>
> スタブでのシリアライザ登録のとき間違って別の
> オブジェクトを指定していたものです.
>
> わからないことだらけなのでWSDDの書き方が間違っているのかと
> 思い(ちょっとデプロイがまともに動いてないこともあって)
> ご迷惑をおかけしました.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-ja-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by FUJIMOTO Jun <j-...@nsg-kk.co.jp>.
今原因がわかりました.

スタブでのシリアライザ登録のとき間違って別の
オブジェクトを指定していたものです.

わからないことだらけなのでWSDDの書き方が間違っているのかと
思い(ちょっとデプロイがまともに動いてないこともあって)
ご迷惑をおかけしました.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by FUJIMOTO Jun <j-...@nsg-kk.co.jp>.
前のメールの内容は間違いでした
スタブでシリアライザを登録していなかったため
出たものです

やはり
致命的: 例外発生: / [en]-(Exception:)
java.lang.IllegalArgumentException: object is not an instance of
declaring class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

となります.



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by FUJIMOTO Jun <j-...@nsg-kk.co.jp>.
>  そこで対処方法ですが、WSDDのlanguageSpecificTypeの指定を
>
>    languageSpecificType="java:hoge.Bar"
>    languageSpecificType="java:hoge.Baz"
>
> といった形に修正して結果を報告お願いできますでしょうか?
> ポイント1は「java:」が追加されていることで、ポイント2は
> クラス「Bar」および「Baz」をパッケージ名を含む名称として
> 記載している点です。上記例では、hogeパッケージということ
> になります。

<service name="FooService" provider="java:RPC">
<parameter name="className" value="foo.Service"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="application"/>
<beanMapping qname="ns:Bar" xmlns:ns="urn:FooService"
languageSpecificType="java:foo.Bar"
/>
<beanMapping qname="ns:Baz" xmlns:ns="urn:FooService"
languageSpecificType="java:foo.Baz"
/>
</service>

のようにしてみましたが

Exception in thread "main" java.lang.AssertionError: Error :
java.io.IOException: レジストリ
org.apache.axis.encoding.TypeMappingDelegate@1ad77a7内に
クラスfoo.Processのシリアライザが見つかりませんでした
/ [en]-(No serializer found for class foo.Process in registry
org.apache.axis.encoding.TypeMappingDelegate@1ad77a7)
at foo.Service.exec(Unknown Source)

となりBeanのプロパティであるBeanがシリアライズできないみたいです.

Barは

package foo;
public class Bar
{
private Baz _baz;

public Baz getBaz(){return _baz;}
public void setBaz(final Baz baz){_baz = baz;}
}

Bazは

package foo;
public class Baz
{
private String _uri;

public String getUri(){return _uri;}
public void setUri(final String uri){_uri = uri;}
}

のようになっています


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by Toshiyuki Kimura <to...@apache.org>.
 木村です。

 「直接server_config.wsddに書き込んでいます」ということで
現象自体は納得しました...。^^;

 そこで対処方法ですが、WSDDのlanguageSpecificTypeの指定を

   languageSpecificType="java:hoge.Bar"
   languageSpecificType="java:hoge.Baz"

といった形に修正して結果を報告お願いできますでしょうか?
ポイント1は「java:」が追加されていることで、ポイント2は
クラス「Bar」および「Baz」をパッケージ名を含む名称として
記載している点です。上記例では、hogeパッケージということ
になります。

---
Toshi <to...@apache.org>

On Thu, 21 Jul 2005, FUJIMOTO Jun wrote:

>
>>  木村です。
>>
>>  IllegalArgumentExceptionですから、プログラムが想定する
>> クラス型以外のインスタンスが引数として渡されているという
>> ことを示しています。
>>
>>  ただ、少し不思議なところもあります。WSDDのbeanMapping
>> 定義で、「languageSpecificType="Bar"」および
>>     「languageSpecificType="Baz"」
>> といった指定がなされていますが、これで問題なくデプロイ
>> できているでしょうか?Exceptionが発生してしまってうまく
>> デプロイできないような気がするのですが...。
>>
>>  どのバージョンのAxisを使われているでしょうか?
>> また、クラスBarおよびBazは、パッケージに属さないクラス
>> ということでしょうか?
>
>
> Axisのバージョンは1.2.1です.
> Bar,Bazは本当はパッケージに属しますがメールに転記
> するとき名前を変え,パッケージを取ったのです.
>
> デプロイできるかどうかわからないのですが
> (デプロイがどうもうまくいかないのでデプロイせずに直接
> server_config.wsddに書き込んでいます)
> Tomcatからサービスのwsddを要求してもエラーが出ずに
> 表示されます.
>
> Barのスタブは作らなくても良いはずと思うのですが
> 間違っているのでしょうか,あるいはWSDDの書き方が
> 誤っているのでしょうか
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-ja-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by FUJIMOTO Jun <j-...@nsg-kk.co.jp>.
>  木村です。
>
>  IllegalArgumentExceptionですから、プログラムが想定する
> クラス型以外のインスタンスが引数として渡されているという
> ことを示しています。
>
>  ただ、少し不思議なところもあります。WSDDのbeanMapping
> 定義で、「languageSpecificType="Bar"」および
>     「languageSpecificType="Baz"」
> といった指定がなされていますが、これで問題なくデプロイ
> できているでしょうか?Exceptionが発生してしまってうまく
> デプロイできないような気がするのですが...。
>
>  どのバージョンのAxisを使われているでしょうか?
> また、クラスBarおよびBazは、パッケージに属さないクラス
> ということでしょうか?


Axisのバージョンは1.2.1です.
Bar,Bazは本当はパッケージに属しますがメールに転記
するとき名前を変え,パッケージを取ったのです.

デプロイできるかどうかわからないのですが
(デプロイがどうもうまくいかないのでデプロイせずに直接
server_config.wsddに書き込んでいます)
Tomcatからサービスのwsddを要求してもエラーが出ずに
表示されます.

Barのスタブは作らなくても良いはずと思うのですが
間違っているのでしょうか,あるいはWSDDの書き方が
誤っているのでしょうか



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by Toshiyuki Kimura <to...@apache.org>.
To: 藤本さん

 木村です。

 IllegalArgumentExceptionですから、プログラムが想定する
クラス型以外のインスタンスが引数として渡されているという
ことを示しています。

 ただ、少し不思議なところもあります。WSDDのbeanMapping
定義で、「languageSpecificType="Bar"」および
    「languageSpecificType="Baz"」
といった指定がなされていますが、これで問題なくデプロイ
できているでしょうか?Exceptionが発生してしまってうまく
デプロイできないような気がするのですが...。

 どのバージョンのAxisを使われているでしょうか?
また、クラスBarおよびBazは、パッケージに属さないクラス
ということでしょうか?

---
Toshi <to...@apache.org>

On Thu, 21 Jul 2005, FUJIMOTO Jun wrote:

> Toshiyuki Kimura wrote:
>
>> To: 藤本さん
>>
>>  はじめまして。木村です。
>>
>>  残念ながら、この問いに対する答えは『無理です』ということに
>> なってしまいます...。
>>
>>  もし、クラスFooがJavaBeanであれば、BeanSerializerを利用する
>> ことが可能ですが、想定されている条件はそのようなケースではない
>> たいめです。ご本人独自でシリアライザ・デシリアライザを実装して
>> カスタムシリアライゼーションを行う必要があると思います。
>>
>>  具体的にどのような利用方法を検討されているのかは不明ですが
>> 「org.apache.axis.encoding.ser.ArraySerializer.java」の実装
>> などが、(もしかしたら)参考になるのではないかと思います。
>>
>>> 初めまして 藤本と申します
>>>
>>> AXISの勉強をしていて,シリアライザとデシリアライザを自分で
>>> 定義してみようと思いましたが以下のような場合についての
>>> 簡単なサンプルを提示していただけませんか
>>>
>>> 1.クラスBarとクラスBazにはシリアライザとデシリアライザが
>>> 定義されている.
>>> 2.クラスFooはFoo(Bar bar, Baz baz)というpublicなコンストラクタ
>>> を持つがインスタンスフィールドにはBarとBazを持たない.
>>> 3.Fooはデフォルトコンストラクタを持たない.
>>>
>>> このような場合FooのデシリアライザをBarとBazのデシリアライザ
>>> を利用して定義するには?
>>
> どうもありがとうございます.
>
> 私はまだAXISについてほとんどわかっていないばかりでなく,
> MLの利用法もわからず,やっと私のメールがML内で有効になっていること
> が今し方わかりました(sendに対してフィルターをかけていたので一つも捕まらず
> 今までずいぶん寂しいMLだと思いこんでいました.)
>
> デシリアライズの実装についてMapSerializer等のソースを眺めて見たのですが
> わからないので取りあえずもっと簡単なところから始めようとして,まずBeanの
> プロパティ
> がBeanである場合について自分なりに(シリアライザは実装せずに
> BeanSerializerを使って)
> スタブ等つくってみましたが,以下の例外となります
>
> 致命的: 例外発生: / [en]-(Exception:)
> java.lang.IllegalArgumentException: object is not an instance of
> declaring class
>
> Beanのプロパティが基本的な型のときはうまくいったのですが何が悪いのでしょうか
>
> スタブは
>
> import java.net.MalformedURLException;
> import java.rmi.RemoteException;
>
> import org.apache.axis.AxisFault;
> import org.apache.axis.client.Call;
>
> import javax.xml.namespace.QName;
> import javax.xml.rpc.ParameterMode;
>
> import static org.apache.axis.encoding.XMLType.*;
>
> public class Service
> {
> private static final String _SERVICE_NAME = "FooService";
> private static final String _ENDPOINT =
> "http://localhost:8080/axis/services/" + _SERVICE_NAME;
> private static final QName _BAR_QNAME =
> new QName( "urn:FooService", "Bar" );
> private static final QName _BAZ_QNAME =
> new QName( "urn:FooService", "Baz" );
>
> private Call _call;
>
> public Service()
> {
> try
> {
> _call = new Call(_ENDPOINT);
> _call.registerTypeMapping(Bar.class, _BAR_QNAME,
> new org.apache.axis.encoding.ser
> .BeanSerializerFactory
> (Bar.class, _BAR_QNAME),
> new org.apache.axis.encoding.ser
> .BeanDeserializerFactory
> (Bar.class, _BAR_QNAME));
> _call.registerTypeMapping(Baz.class, _BAZ_QNAME,
> new org.apache.axis.encoding.ser
> .BeanSerializerFactory
> (Baz.class, _BAZ_QNAME),
> new org.apache.axis.encoding.ser
> .BeanDeserializerFactory
> (Baz.class, _BAZ_QNAME));
> }
> catch(MalformedURLException e)
> {
> assert false : "Error:" + e.toString();
> }
> }
>
> public void exec(final Bar bar)
> {
> try
> {
> _call.removeAllParameters();
> _call.setOperationName( new QName(_SERVICE_NAME, "exec") );
> _call.addParameter("arg1", _BAR_QNAME, ParameterMode.IN );
> _call.setReturnType(AXIS_VOID);
> _call.invoke( new Object[]{project, } );
> }
> catch (AxisFault fault)
> {
> assert false : "Error : " + fault.toString();
> }
> catch (RemoteException fault)
> {
> assert false : "Error : " + fault.toString();
> }
> }
> }
>
> WSDDは
>
> <service name="FooService" provider="java:RPC">
> <parameter name="className" value="Service"/>
> <parameter name="allowedMethods" value="*"/>
> <parameter name="scope" value="application"/>
> <beanMapping qname="prj:Bar" xmlns:prj="urn:FooService"
> languageSpecificType="Bar"
> />
> <beanMapping qname="prj:Baz" xmlns:prj="urn:FooService"
> languageSpecificType="Baz"
> />
> </service>
>
> でBazはBarのプロパティです(getBaz,setBazがある).
>
>
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-ja-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by FUJIMOTO Jun <j-...@nsg-kk.co.jp>.
先ほどのにミスがありました

>_call.invoke( new Object[]{project, } );
>  
>
とあるのは
_call.invoke(new Object[]{bar, });
の間違いでした.エラーになるのはこれが原因ではありません.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by FUJIMOTO Jun <j-...@nsg-kk.co.jp>.
Toshiyuki Kimura wrote:

> To: 藤本さん
>
>  はじめまして。木村です。
>
>  残念ながら、この問いに対する答えは『無理です』ということに
> なってしまいます...。
>
>  もし、クラスFooがJavaBeanであれば、BeanSerializerを利用する
> ことが可能ですが、想定されている条件はそのようなケースではない
> たいめです。ご本人独自でシリアライザ・デシリアライザを実装して
> カスタムシリアライゼーションを行う必要があると思います。
>
>  具体的にどのような利用方法を検討されているのかは不明ですが
> 「org.apache.axis.encoding.ser.ArraySerializer.java」の実装
> などが、(もしかしたら)参考になるのではないかと思います。
>
>> 初めまして 藤本と申します
>>
>> AXISの勉強をしていて,シリアライザとデシリアライザを自分で
>> 定義してみようと思いましたが以下のような場合についての
>> 簡単なサンプルを提示していただけませんか
>>
>> 1.クラスBarとクラスBazにはシリアライザとデシリアライザが
>> 定義されている.
>> 2.クラスFooはFoo(Bar bar, Baz baz)というpublicなコンストラクタ
>> を持つがインスタンスフィールドにはBarとBazを持たない.
>> 3.Fooはデフォルトコンストラクタを持たない.
>>
>> このような場合FooのデシリアライザをBarとBazのデシリアライザ
>> を利用して定義するには?
>
どうもありがとうございます.

私はまだAXISについてほとんどわかっていないばかりでなく,
MLの利用法もわからず,やっと私のメールがML内で有効になっていること
が今し方わかりました(sendに対してフィルターをかけていたので一つも捕まらず
今までずいぶん寂しいMLだと思いこんでいました.)

デシリアライズの実装についてMapSerializer等のソースを眺めて見たのですが
わからないので取りあえずもっと簡単なところから始めようとして,まずBeanの
プロパティ
がBeanである場合について自分なりに(シリアライザは実装せずに
BeanSerializerを使って)
スタブ等つくってみましたが,以下の例外となります

致命的: 例外発生: / [en]-(Exception:)
java.lang.IllegalArgumentException: object is not an instance of
declaring class

Beanのプロパティが基本的な型のときはうまくいったのですが何が悪いのでしょうか

スタブは

import java.net.MalformedURLException;
import java.rmi.RemoteException;

import org.apache.axis.AxisFault;
import org.apache.axis.client.Call;

import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import static org.apache.axis.encoding.XMLType.*;

public class Service
{
private static final String _SERVICE_NAME = "FooService";
private static final String _ENDPOINT =
"http://localhost:8080/axis/services/" + _SERVICE_NAME;
private static final QName _BAR_QNAME =
new QName( "urn:FooService", "Bar" );
private static final QName _BAZ_QNAME =
new QName( "urn:FooService", "Baz" );

private Call _call;

public Service()
{
try
{
_call = new Call(_ENDPOINT);
_call.registerTypeMapping(Bar.class, _BAR_QNAME,
new org.apache.axis.encoding.ser
.BeanSerializerFactory
(Bar.class, _BAR_QNAME),
new org.apache.axis.encoding.ser
.BeanDeserializerFactory
(Bar.class, _BAR_QNAME));
_call.registerTypeMapping(Baz.class, _BAZ_QNAME,
new org.apache.axis.encoding.ser
.BeanSerializerFactory
(Baz.class, _BAZ_QNAME),
new org.apache.axis.encoding.ser
.BeanDeserializerFactory
(Baz.class, _BAZ_QNAME));
}
catch(MalformedURLException e)
{
assert false : "Error:" + e.toString();
}
}

public void exec(final Bar bar)
{
try
{
_call.removeAllParameters();
_call.setOperationName( new QName(_SERVICE_NAME, "exec") );
_call.addParameter("arg1", _BAR_QNAME, ParameterMode.IN );
_call.setReturnType(AXIS_VOID);
_call.invoke( new Object[]{project, } );
}
catch (AxisFault fault)
{
assert false : "Error : " + fault.toString();
}
catch (RemoteException fault)
{
assert false : "Error : " + fault.toString();
}
}
}

WSDDは

<service name="FooService" provider="java:RPC">
<parameter name="className" value="Service"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="scope" value="application"/>
<beanMapping qname="prj:Bar" xmlns:prj="urn:FooService"
languageSpecificType="Bar"
/>
<beanMapping qname="prj:Baz" xmlns:prj="urn:FooService"
languageSpecificType="Baz"
/>
</service>

でBazはBarのプロパティです(getBaz,setBazがある).








---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org


Re: desreializer

Posted by Toshiyuki Kimura <to...@apache.org>.
To: 藤本さん

 はじめまして。木村です。

# 前メールの文字コードがUTF-8となっており、環境によっては
#文字化けを起こしていた可能性があるため、再送しておきます。

> このような場合FooのデシリアライザをBarとBazのデシリアライザ
> を利用して定義するには?

 残念ながら、この問いに対する答えは『無理です』ということに
なってしまいます...。

 もし、クラスFooがJavaBeanであれば、BeanSerializerを利用する
ことが可能ですが、想定されている条件はそのようなケースではない
たいめです。ご本人独自でシリアライザ・デシリアライザを実装して
カスタムシリアライゼーションを行う必要があると思います。

 具体的にどのような利用方法を検討されているのかは不明ですが
「org.apache.axis.encoding.ser.ArraySerializer.java」の実装
などが、(もしかしたら)参考になるのではないかと思います。

よろしくお願いします。
--
Toshi <to...@apache.org>

On Wed, 13 Jul 2005, FUJIMOTO Jun wrote:

> 初めまして 藤本と申します
>
> AXISの勉強をしていて,シリアライザとデシリアライザを自分で
> 定義してみようと思いましたが以下のような場合についての
> 簡単なサンプルを提示していただけませんか
>
> 1.クラスBarとクラスBazにはシリアライザとデシリアライザが
> 定義されている.
> 2.クラスFooはFoo(Bar bar, Baz baz)というpublicなコンストラクタ
> を持つがインスタンスフィールドにはBarとBazを持たない.
> 3.Fooはデフォルトコンストラクタを持たない.
>
> このような場合FooのデシリアライザをBarとBazのデシリアライザ
> を利用して定義するには?
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-user-ja-help@ws.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-user-ja-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-user-ja-help@ws.apache.org