- PR -

ERROR org.apache.myfaces.renderkit.RendererUtils - No converter for class

1
投稿者投稿内容
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-23 23:30
MyFaces+Spring+Hibernate環境でWebアプリを
作っていますが、下記のようなエラーが頻発します。
----
2005-11-22 13:26:17,738 [http-8080-Processor24] ERROR
org.apache.myfaces.renderkit.RendererUtils - No converter for class
hoge.package.HogeClass found (component id=_id16).
----
hoge.package.HogeClassは、managed-beanのフィールドに
使用しているクラスで、
private HogeClass hoge;
JSPでは、
<h:outputText value="#{hogeClass.hoge}" />
といった使い方をしていて、
まぁ、特にStringでなくても、toString()で表示して
くれるだろうとの思惑の基、正しく表示されています。
しかし、上記エラーが出ます。
エラー回避策はございますでしょうか?
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2005-11-25 18:42
MyFaces1.1.0(SpringもHibernateも不使用)で適当なクラス「sample.User」を
コード:
<h:outputText value="#{bean.user}" />


といった形で呼んでみたところ、
コード:
sample.User@1f4e0ba


といった文字列が表示され、エラーログは特に出力されませんでした。

RendererUtilsのソースを読んでみた感じでは、faces-config.xmlの<converter>に当該クラスに関連するものが無ければエラーログを出力せずにスルーしそうな雰囲気(1.0.9も同様)なのですが、<converter>の設定はどんな感じでしょうか。

ちなみに、下記のような設定をfaces-config.xmlに入れて実行したところ、見事「No converter for class sample.User found (component id=_id0).」というエラーログが出力されました。
コード:
<converter>
  <converter-for-class>sample.User</converter-for-class>
  <converter-class>dummy</converter-class>
</converter>


トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-25 19:07
確認していただいてありがとうございます。

<converter>は、今のところ使用しておりません。
エラーログを出力せずにスルーしてくれないですねぇ。

Converterを作成してみようと思ったのですが、
 private HogeClass hoge;
HogeClassは、実はインターフェースでして、
実装クラスが特定できない場合、Converterをどのように
作ればよいのかわからなくなりました。
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2005-11-26 00:19
んー。エラーログの方は謎ですねぇ。
前述のsample.Userをインターフェースにしてみたのですが、エラーログは出力されませんでした。

インターフェースのConverterについては普通のクラスのConverterと同じように作れると思います。
サンプルとしてはMyFaces1.1.0のTomahawkに入っている「fileupload」が使えると思います。
このコンポーネントは、インターフェース「UploadedFile」に対してコンバータ「UploadedFileConverter」を適用しており、これらをtomahawk.jarのMETA-INFに格納されているfaces-config.xmlで以下のように関連付けています。
コード:
<converter>
  <converter-for-class>org.apache.myfaces.custom.fileupload.UploadedFile</converter-for-class>
  <converter-class>org.apache.myfaces.custom.fileupload.UploadedFileConverter</converter-class>
</converter>



まぁ、「UploadedFileConverter」は「getAsString()」に以下のような処理が入っているだけですので、サンプルというほど大層なものではありませんが……。
コード:
return ((UploadedFile)obj).getName();


トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-26 17:19
たいへんお世話になっております。

Converterを作って、faces-config.xmlに追加しましたが、
結果はかわらないです。

もし、よろしければ、
sample.Userのソースを見せていただけないでしょうか?
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2005-11-26 19:50
sample.Userは会社で使っているコードを流用しているため、改めてブランクから実験用コードを作りました。

Javaソース×3本
Dummy.java
コード:
package sample;
public interface Dummy {
  String getFoo();
}


DummyImpl.java
コード:
package sample;
public class DummyImpl implements Dummy {
  public String getFoo() { return "boee"; }
}


MyBean.java
コード:
package sample;
public class MyBean {
  private Dummy dummy = new DummyImpl();
  public Dummy getDummy() { return dummy; }
  public void setDummy(Dummy dummy) { this.dummy = dummy; }
}



JSPファイル×1本
dummy.jsp
コード:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html><head><title>Dummy</title></head><body><f:view>
  <h:outputText value="Data is [" />
  <h:outputText value="#{myBean.dummy}" />
  <h:outputText value="]." />
</f:view></body></html>



設定ファイル×1本
faces-config.xml
コード:
<?xml version="1.0" ?>
<!DOCTYPE faces-config
  PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
  "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
  <managed-bean>
    <managed-bean-name>myBean</managed-bean-name>
    <managed-bean-class>sample.MyBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
</faces-config>



他にlog4j.propertiesとweb.xmlがありますが、これらは省略します。
上記のようなアプリケーションをJ2SE1.5_04、MyFaces1.1.0、Tomcat4.1.31で動かしたところ、エラーログは出力されずに画面に「Data is [ sample.DummyImpl@d2883b ]. 」と表示されました。

ここで、faces-config.xmlに以下の行を追加してみました。
コード:
  <converter>
    <converter-for-class>sample.Dummy</converter-for-class>
    <converter-class>dummy</converter-class>
  </converter>



すると、エラーログに「java.lang.ClassNotFoundException: dummy」と「No converter for class sample.DummyImpl found (component id=_id1).」が出力され、画面には「Data is [ sample.DummyImpl@8b60a ]. 」と表示されました。

次の投稿でConverterを付けてみます。
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2005-11-26 20:08
以下のようなソースを追加しました。

DummyConverter.java
コード:
package sample;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
public class DummyConverter implements Converter {
  public Object getAsObject(FacesContext context,
    UIComponent component,String value) throws ConverterException {
      return value;
  }
  public String getAsString(FacesContext context,
    UIComponent component, Object obj) throws ConverterException {
      return ((Dummy) obj).getFoo();
  }
}



また、faces-config.xmlの<converter>の記述を以下のように変更しました。
コード:
  <converter>
    <converter-for-class>sample.Dummy</converter-for-class>
    <converter-class>sample.DummyConverter</converter-class>
  </converter>



この状態で実行したところ、エラーログは出力されずに画面に「Data is [ boee ]. 」と表示されました。

んー。何ででしょうねぇ。
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-28 00:48
ソースをご提供いただき、ありがとうございました。

これをもとに調査したいと思います。
ひとまず、ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)