[Seasar-user:13146] [S2Container] ConversionRuleを定義したDxoが動かなくなりました.

Applied_MATSUDA Masaaki [E-MAIL ADDRESS DELETED]
2008年 3月 4日 (火) 12:42:36 JST


TigerCatです.お世話になっております.


S2Container を2.4.17から2.4.18以降(最新版2.4.23も含む)へ差し替えたところ,
いままで動いていたDxoがExceptionを吐くようになってしまいました.


Dxoのコードはこんなふうです.

  @ConversionRule("testEntityHead.productCode : productCode,
testEntityHead.status : status")
  void convert(TestDto testDto, TestEntityDetail testEntityDetail);


Dtoから外部キーを持つEntityへ放り込むかんじです.
TestEntityDetail のフィールドとして TestEntityHead を持つかたちになっています.

TestEntityDetailのコードはこんなふうです.

  @ManyToOne
  @JoinColumn(name="HEAD_PRODUCT_CODE", referencedColumnName="PRODUCT_CODE")
  private TestEntityHead testEntityHead;

  @Id
  @Column(name="ID", length=32)
  private String id;

  @Column(name="PRODUCT_NAME", nullable=false, length=128)
  private String productName;

  public TestEntityHead getTestEntityHead() {
    return testEntityHead;
  }

  public void setTestEntityHead(TestEntityHead testEntityHead) {
    this.testEntityHead = testEntityHead;
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getProductName() {
    return productName;
  }

  public void setProductName(String productName) {
    this.productName = productName;
  }


これのマスターテーブルが TestEntityHead です.
コードはこんなかんじです.

  @Id
  @Column(name="PRODUCT_CODE", nullable=false, length=10)
  private String productCode;

  @Column(name="STATUS", nullable=false)
  private Integer status;

  @OneToMany(mappedBy="testEntityHead")
  private Collection<TestEntityDetail> testEntityDetails;


  public String getProductCode() {
    return productCode;
  }

  public void setProductCode(String productCode) {
    this.productCode = productCode;
  }

  public Integer getStatus() {
    return status;
  }

  public void setStatus(Integer status) {
    this.status = status;
  }

  public Collection<TestEntityDetail> getTestEntityDetails() {
    return testEntityDetails;
  }

  public void setTestEntityDetails(Collection<TestEntityDetail> testEntityDetails) {
    this.testEntityDetails = testEntityDetails;
  }


Dtoのコードは,

  public String productCode;
  public String productName;
  public Integer status;

となっており,


適当な検証コードが,

  public static void main(String[] args) {
    SingletonS2ContainerFactory.setConfigPath("app_test.dicon");
    SingletonS2ContainerFactory.init();
    TestDxo testDxo = SingletonS2Container.getComponent(TestDxo.class);

    TestDto testDto = new TestDto();
    testDto.productCode = "12345";
    testDto.productName = "あいうえお";
    testDto.status = 5;

    TestEntityDetail testEntityDetail = new TestEntityDetail();
    testEntityDetail.setTestEntityHead(new TestEntityHead());

    testDxo.convert(testDto, testEntityDetail);

    System.out.println( "productName: " + testEntityDetail.getProductName());
    System.out.println( "productCode: " +
testEntityDetail.getTestEntityHead().getProductCode());
  }

ひととおりのテストコードは以上な具合です.
いざ実行しますと,
末尾に貼り付けたような例外を発生します.
「理由はcom.appliedjapan.sato.casemgr.dto.TestDto.testEntityHead」
といっているようですが,何故にDtoのほうを見にいっちゃうんでしょうか?

関連する完全なソースは添付いたしました.
test_app.dicon は入れていませんが,基本的にDoltengが作ってくれたもの
からTeeda関連を抜いたものとなっております.

2.4.18ぐらいからDxoもいろいろ修正が入っているようなのですが,関連
しそうなところ追いきれませんでした・・・
(こちらのEntityの作りがおかしいのかもですけど)

なにとぞよろしくお願いいたします.


----- スタックトレース

2008-03-04 12:31:00,204 [main] INFO 
org.seasar.framework.container.factory.SingletonS2ContainerFactory - Running on
[ENV]ct, [DEPLOY MODE]Hot Deploy
2008-03-04 12:31:00,220 [main] DEBUG
org.seasar.framework.container.util.S2ContainerUtil - クラス
(com.appliedjapan.sato.casemgr.dxo.TestDxo[testDxo])のコンポーネント定義を登録します
1:
2008-03-04 12:31:00,220 [main] DEBUG
org.seasar.framework.aop.interceptors.TraceInterceptor - BEGIN
com.appliedjapan.sato.casemgr.dxo.TestDxo#convert([E-MAIL ADDRESS DELETED],
[E-MAIL ADDRESS DELETED])
2008-03-04 12:31:00,236 [main] DEBUG
org.seasar.framework.aop.interceptors.TraceInterceptor - END
com.appliedjapan.sato.casemgr.dxo.TestDxo#convert([E-MAIL ADDRESS DELETED],
[E-MAIL ADDRESS DELETED])
Throwable:org.seasar.framework.exception.OgnlRuntimeException: [ESSR0073]OGNLで
例外が発生しました。理由はcom.appliedjapan.sato.casemgr.dto.TestDto.testEntityHead
Exception in thread "main" org.seasar.framework.exception.OgnlRuntimeException:
[ESSR0073]OGNLで例外が発生しました。理由は
com.appliedjapan.sato.casemgr.dto.TestDto.testEntityHead
	at org.seasar.framework.util.OgnlUtil.getValue(OgnlUtil.java:100)
	at org.seasar.framework.util.OgnlUtil.getValue(OgnlUtil.java:62)
	at org.seasar.framework.util.OgnlUtil.getValue(OgnlUtil.java:47)
	at org.seasar.extension.dxo.util.OgnlExpression.evaluate(OgnlExpression.java:53)
	at
org.seasar.extension.dxo.converter.impl.ConversionContextImpl.<init>(ConversionContextImpl.java:178)
	at
org.seasar.extension.dxo.command.impl.AbstractDxoCommand.createContext(AbstractDxoCommand.java:126)
	at
org.seasar.extension.dxo.command.impl.BeanToBeanDxoCommand.convertScalar(BeanToBeanDxoCommand.java:70)
	at
org.seasar.extension.dxo.command.impl.AbstractDxoCommand$ScalarConversionHelper.convert(AbstractDxoCommand.java:223)
	at
org.seasar.extension.dxo.command.impl.AbstractDxoCommand.execute(AbstractDxoCommand.java:78)
	at org.seasar.extension.dxo.DxoInterceptor.invoke(DxoInterceptor.java:57)
	at
com.appliedjapan.sato.casemgr.dxo.TestDxo$$EnhancedByS2AOP$$10bbd42$$MethodInvocation$$convert0.proceed(MethodInvocationClassGenerator.java)
	at
org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:73)
	at
com.appliedjapan.sato.casemgr.dxo.TestDxo$$EnhancedByS2AOP$$10bbd42$$MethodInvocation$$convert0.proceed(MethodInvocationClassGenerator.java)
	at
com.appliedjapan.sato.casemgr.dxo.TestDxo$$EnhancedByS2AOP$$10bbd42.convert(TestDxo$$EnhancedByS2AOP$$10bbd42.java)
	at com.appliedjapan.sato.casemgr.logic.DxoTest.main(DxoTest.java:27)
Caused by: ognl.NoSuchPropertyException:
com.appliedjapan.sato.casemgr.dto.TestDto.testEntityHead
	at ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:122)
	at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:1758)
	at ognl.ASTProperty.getValueBody(ASTProperty.java:92)
	at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:171)
	at ognl.SimpleNode.getValue(SimpleNode.java:211)
	at ognl.ASTChain.getValueBody(ASTChain.java:109)
	at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:171)
	at ognl.SimpleNode.getValue(SimpleNode.java:211)
	at ognl.ASTMap.getValueBody(ASTMap.java:90)
	at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:171)
	at ognl.SimpleNode.getValue(SimpleNode.java:211)
	at ognl.Ognl.getValue(Ognl.java:333)
	at ognl.Ognl.getValue(Ognl.java:413)
	at ognl.Ognl.getValue(Ognl.java:395)
	at org.seasar.framework.util.OgnlUtil.getValue(OgnlUtil.java:97)
	... 14 more
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: Test.zip
型:         application/x-zip-compressed
サイズ:     3745 バイト
説明:       無し
URL:        http://ml.seasar.org/archives/seasar-user/attachments/20080304/9e8c3cff/attachment-0001.bin 


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