[Seasar-user:10406] Re: S2DxoのConversionRule指定でIllegalArgumentException

出羽 健一 [E-MAIL ADDRESS DELETED]
2007年 9月 8日 (土) 15:31:34 JST


出羽です。

下記の件、自己解決しました。

次のように、ConversionRuleの引数文字列に、三項演算子を利用している
場合は、'empName' : name のように、変換先のプロパティを
シングルクォーテーションで囲むことで上手く動作するようになりました。

@ConversionRule("'empName' : name, 'deptName' : dept != null ? dept.name : null")
public EmpDto[] convert(List<Emp> emp);

なるほど。変換先のプロパティをシングルクォーテーションで囲むのは、ネストや三項演算子などのOGNL式を使う変換先と変換元の組み合わせ単位で使うものと勘違いしていました。

1つでも、OGNL式を使う場合は、全ての変換先のプロパティをシングルクォーテーションで囲むようにすれば大丈夫という訳ですね。

# ここはハマる人が多そうなので、Doltengのサポートがあったらいいなぁ。


> -----Original Message-----
> From: [E-MAIL ADDRESS DELETED]
> [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of 出羽 健一
> Sent: Saturday, September 08, 2007 2:28 PM
> To: [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:10403]S2DxoのConversionRule指定で
> IllegalArgumentException
> 
> 出羽です。
> 
> S2Dxoのnull対策のための三項演算子を使っていて、不具合かも知れない(私の勘
> 違い?)現象を発見したので、報告します。
> 
> ■ケース1:通常のマッピング
>  @ConversionRule("empName : name")
>  public EmpDto[] convert(List<Emp> emp);
>  ⇒ 正常に動きます。
> 
> ■ケース2:null対策用に三項演算子を使ったマッピング
>  @ConversionRule("'deptName' : dept != null ? dept.name : null")
>  public EmpDto[] convert(List<Emp> emp);
>  ⇒ 正常に動きます。
> 
> ■ケース3:ケース1とケース2を組み合わせたケース
>  @ConversionRule("empName : name, 'deptName' : dept != null ? dept.name :
> null")
>  public EmpDto[] convert(List<Emp> emp);
>  ⇒ 例外が発生します。
> 
> プロダクトのバージョン情報:
>  S2-Container: 2.4.17
>  Teeda: 1.0.11-RC1
> 
> 以上、宜しくお願いします。
> 
> ********** ケース3のスタックトレース **********
>     * empName : name, 'deptName' : dept != null ? dept.name : null(-3)
> 
> java.lang.IllegalArgumentException: empName : name, 'deptName' : dept !=
> null ? dept.name : null(-3)
>   at org.seasar.extension.dxo.util.DxoUtil#addQuote (DxoUtil.java#158)
>   at org.seasar.extension.dxo.util.DxoUtil#parseMap (DxoUtil.java#102)
>   at
> org.seasar.extension.dxo.converter.impl.ConversionContextImpl#createContex
> tInfo (ConversionContextImpl.java#330)
>   at
> org.seasar.extension.dxo.converter.impl.ConversionContextImpl#getContextIn
> fo (ConversionContextImpl.java#302)
>   at org.seasar.extension.dxo.converter.impl.ConversionContextImpl#
> (ConversionContextImpl.java#169)
>   at
> org.seasar.extension.dxo.command.impl.AbstractDxoCommand#createContext
> (AbstractDxoCommand.java#125)
>   at
> org.seasar.extension.dxo.command.impl.BeanToBeanDxoCommand#convertScalar
> (BeanToBeanDxoCommand.java#58)
>   at
> org.seasar.extension.dxo.command.impl.AbstractDxoCommand$ListToArrayConver
> sionHelper#convert (AbstractDxoCommand.java#239)
>   at org.seasar.extension.dxo.command.impl.AbstractDxoCommand#execute
> (AbstractDxoCommand.java#77)
>   at org.seasar.extension.dxo.DxoInterceptor#invoke
> (DxoInterceptor.java#57)
>   at
> sample.web.emp2.Emp2Dxo$$EnhancedByS2AOP$$a0eb2a$$MethodInvocation$$conver
> t0#proceed (MethodInvocationClassGenerator.java)
>   at org.seasar.framework.aop.interceptors.TraceInterceptor#invoke
> (TraceInterceptor.java#73)
>   at
> sample.web.emp2.Emp2Dxo$$EnhancedByS2AOP$$a0eb2a$$MethodInvocation$$conver
> t0#proceed (MethodInvocationClassGenerator.java)
>   at sample.web.emp2.Emp2Dxo$$EnhancedByS2AOP$$a0eb2a#convert
> (Emp2Dxo$$EnhancedByS2AOP$$a0eb2a.java)
>   at sample.web.emp2.EmpListPage#prerender (EmpListPage.java#33)
>   at
> sample.web.emp2.EmpListPage$$EnhancedByS2AOP$$d1a34a#$$prerender$$invokeSu
> perMethod$$ (EmpListPage$$EnhancedByS2AOP$$d1a34a.java)
>   at
> sample.web.emp2.EmpListPage$$EnhancedByS2AOP$$d1a34a$$MethodInvocation$$pr
> erender1#proceed (MethodInvocationClassGenerator.java)
>   at org.seasar.extension.tx.RequiredInterceptor#invoke
> (RequiredInterceptor.java#48)
>   at
> sample.web.emp2.EmpListPage$$EnhancedByS2AOP$$d1a34a$$MethodInvocation$$pr
> erender1#proceed (MethodInvocationClassGenerator.java)
>   at org.seasar.framework.aop.interceptors.ThrowsInterceptor#invoke
> (ThrowsInterceptor.java#73)
>   at
> sample.web.emp2.EmpListPage$$EnhancedByS2AOP$$d1a34a$$MethodInvocation$$pr
> erender1#proceed (MethodInvocationClassGenerator.java)
>   at sample.web.emp2.EmpListPage$$EnhancedByS2AOP$$d1a34a#prerender
> (EmpListPage$$EnhancedByS2AOP$$d1a34a.java)
>   at sun.reflect.NativeMethodAccessorImpl#invoke0
> (NativeMethodAccessorImpl.java)
>   at sun.reflect.NativeMethodAccessorImpl#invoke
> (NativeMethodAccessorImpl.java#39)
>   at sun.reflect.DelegatingMethodAccessorImpl#invoke
> (DelegatingMethodAccessorImpl.java#25)
>   at java.lang.reflect.Method#invoke (Method.java#585)
>   at org.seasar.framework.util.MethodUtil#invoke (MethodUtil.java#73)
>   at org.seasar.framework.beans.impl.BeanDescImpl#invoke
> (BeanDescImpl.java#213)
>   at org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl#invoke
> (HtmlComponentInvokerImpl.java#159)
>   at
> org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl#invokePreren
> der (HtmlComponentInvokerImpl.java#134)
>   at org.seasar.teeda.extension.render.TViewRootRenderer#invoke
> (TViewRootRenderer.java#312)
>   at org.seasar.teeda.extension.render.TViewRootRenderer#encodeBegin
> (TViewRootRenderer.java#140)
>   at javax.faces.component.UIComponentBase#encodeBegin
> (UIComponentBase.java#330)
>   at javax.faces.component.UIViewRoot#encodeBegin (UIViewRoot.java#100)
>   at javax.faces.webapp.UIComponentTag#encodeBegin
> (UIComponentTag.java#240)
>   at javax.faces.webapp.UIComponentTag#doStartTag (UIComponentTag.java#177)
>   at org.seasar.teeda.extension.taglib.TViewTag#doStartTag
> (TViewTag.java#100)
>   at
> org.seasar.teeda.extension.html.processor.ElementProcessorImpl#processTag
> (ElementProcessorImpl.java#145)
>   at
> org.seasar.teeda.extension.html.processor.ElementProcessorImpl#process
> (ElementProcessorImpl.java#138)
>   at
> org.seasar.teeda.extension.html.processor.ElementProcessorImpl#process
> (ElementProcessorImpl.java#119)
>   at org.seasar.teeda.extension.html.impl.HtmlViewHandler#renderView
> (HtmlViewHandler.java#160)
>   at org.seasar.teeda.extension.html.impl.HtmlViewHandler#renderView
> (HtmlViewHandler.java#141)
>   at org.seasar.teeda.core.lifecycle.impl.RenderResponsePhase#executePhase
> (RenderResponsePhase.java#38)
>   at org.seasar.teeda.core.lifecycle.AbstractPhase#execute
> (AbstractPhase.java#57)
>   at org.seasar.teeda.core.lifecycle.LifecycleImpl#render
> (LifecycleImpl.java#131)
> 
> 
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user


Seasar-user メーリングリストの案内