指定されたインデックスで文字列を切り捨て、継続記号を追加するカスタム切り捨てコンバーターを実装しようとしています。パラメータがバックエンドに渡されないため、パラメータをハードコーディングした場合にのみ、コンバータは正常に動作します。私は何が間違っているのですか?
パラメータは、コンバータクラスのプロパティです。
@FacesConverter(value = TruncateConverter.CONVERTER_ID)
public class TruncateConverter implements Converter, StateHolder
{
public static final String CONVERTER_ID = "bla.blablabla.Truncate";
private int truncateIndex;
private String contSymbol;
これが私がコンバーターをどのように使用しているのか(またはしようとしているのか)です:
<h:outputText id="news-text-left" value="#{newsListBean.newsList_teaser.text}">
<f:converter converterId="bla.blablabla.Truncate" truncateIndex="150" contSymbol="..." />
</h:outputText>
私はかなりグーグルで検索しましたが、パラメーターを使用したJSF2コンバーターの例を1つも見つけることができませんでした...ご協力いただきありがとうございます。
JSF2.0のソースをご覧ください。たとえば、DateTimeConverter ...ここでsvnリポジトリで利用可能なJSFソース: https://svn.Java.net/svn/mojarra~svn/trunk
このようなコンバーターを作成するIMOは簡単ではありません。また、コンバーターを登録するためのコンバータータグを作成する必要がありました。
一部のデータをコンバーターに渡す他の方法は、属性です。だからあなたは書くことができます
_<h:outputText ...>
<f:converter converterId="bla.blablabla.Truncate" />
<f:attribute name="truncateIndex" value="150"/>
</h:outputText>
_
コンバーターコードでcomponent.getAttributes().get("truncateIndex");
を呼び出すより。
http://jerryorr.blogspot.nl/2011/10/creating-jsf-12-custom-converter-with.html は、パラメーターを使用して最初のカスタムコンバーターをセットアップするための優れたガイドです。
@ Maks ソリューションに基づく:コンバーターと属性を1つのタグに組み合わせることができます。
<facelet-taglib version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
<namespace>http://mycompany.com/some-identifier</namespace>
<tag>
<tag-name>truncate</tag-name>
<converter>
<converter-id>bla.blablabla.Truncate</converter-id>
</converter>
<attribute>
<name>truncateIndex</name>
</attribute>
</tag>
</facelet-taglib>
次に、次のようにコンバーターを使用できます。
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:my="http://mycompany.com/some-identifier">
<my:truncate truncateIndex="150" />
</ui:composition>
また、component-attributesからパラメーターを取得する必要はありません。同じ名前のBeanプロパティが自動的に入力されます。
@FacesConverter("bla.blablabla.Truncate")
public class Truncate implements Converter {
private String truncateIndex;
// getters + setters
...
}
これは私がそれをした方法です(別のjarファイルで、mavenのデフォルトディレクトリを使用して):
1)コンバーターのクラスを作成します(src/main/Java内)
2).taglib.xmlクラスを作成します(src/main/resources/META-INF内)
3)faces-config.xml(src/main/resources/META-INF内)を作成します
例:
ステップ1)
package com.ocabit.jsf.converter;
import Java.io.Serializable;
import Java.math.BigDecimal;
import Java.math.RoundingMode;
import Java.text.NumberFormat;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import org.springframework.stereotype.Service;
import com.ocabit.utils.currency.CurrencyUtils;
/**
* Converter para valores BigDecimal.
*
* @author Carlos Eduardo Pauluk
*
*/
@FacesConverter("bigDecimalConverter")
@Service("bigDecimalConverter")
public class BigDecimalConverter implements Converter, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final String CONVERTER_ID = "com.ocabit.jsf.converter.BigDecimalConverter";
/**
* Em caso de null, força a saída para 0.0;
*/
private boolean nullToZero = false;
/**
* Em caso de zero, força a saída para null;.
*/
private boolean zeroToNull = false;
/**
* Só retorna números positivos.
*/
private boolean onlyAbs = false;
/**
* Só retorna números negativos.
*/
private boolean onlyNeg = false;
/**
* Quantidade de casas decimais.
*/
private int decimals = 2;
@Override
public Object getAsObject(final FacesContext context, final UIComponent component, final String value) {
try {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(getDecimals(), RoundingMode.HALF_DOWN);
if (bd.equals(BigDecimal.ZERO) && isZeroToNull()) {
return null;
}
if (isOnlyAbs()) {
bd = bd.abs();
}
if (isOnlyNeg()) {
bd = bd.abs();
bd = bd.negate();
}
return bd;
} catch (final Exception e) {
BigDecimal bd = null;
if (isNullToZero()) {
bd = CurrencyUtils.getBigDecimalCurrency("0.0");
bd = bd.setScale(getDecimals(), RoundingMode.HALF_DOWN);
}
return bd;
}
}
@Override
public String getAsString(final FacesContext context, final UIComponent component, final Object value) {
if (!(value instanceof BigDecimal)) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao converter o valor decimal.", ""));
}
final NumberFormat nf = NumberFormat.getInstance();
// sempre terá 2 casas decimais
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
return nf.format(((BigDecimal) value).doubleValue());
}
public boolean isNullToZero() {
return nullToZero;
}
public void setNullToZero(boolean nullToZero) {
this.nullToZero = nullToZero;
}
public boolean isZeroToNull() {
return zeroToNull;
}
public void setZeroToNull(boolean zeroToNull) {
this.zeroToNull = zeroToNull;
}
public boolean isOnlyAbs() {
return onlyAbs;
}
public void setOnlyAbs(boolean onlyAbs) {
this.onlyAbs = onlyAbs;
}
public boolean isOnlyNeg() {
return onlyNeg;
}
public void setOnlyNeg(boolean onlyNeg) {
this.onlyNeg = onlyNeg;
}
public int getDecimals() {
return decimals;
}
public void setDecimals(int decimals) {
this.decimals = decimals;
}
}
ステップ2)
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"facelet-taglib_1_0.dtd">
<facelet-taglib version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
<namespace>http://ocabit.com.br/facelets</namespace>
<tag>
<tag-name>convertBigDecimal</tag-name>
<converter>
<converter-id>com.ocabit.jsf.converter.BigDecimalConverter</converter-id>
</converter>
</tag>
</facelet-taglib>
ステップ3)
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<converter>
<description></description>
<converter-id>com.ocabit.jsf.converter.BigDecimalConverter</converter-id>
<converter-class>com.ocabit.jsf.converter.BigDecimalConverter</converter-class>
<property>
<property-name>nullToZero</property-name>
<property-class>boolean</property-class>
<description>Ao invés de retornar 'null', retorna '0.0'</description>
</property>
<property>
<property-name>zeroToNull</property-name>
<property-class>boolean</property-class>
<description>Ao invés de retornar '0.0', retorna 'null'</description>
</property>
<property>
<property-name>onlyAbs</property-name>
<property-class>boolean</property-class>
<description>Somente retorna números positivos</description>
</property>
<property>
<property-name>onlyNeg</property-name>
<property-class>boolean</property-class>
<description>Somente retorna números negativos</description>
</property>
<property>
<property-name>decimals</property-name>
<property-class>int</property-class>
<description>Quantidade de casas decimais</description>
</property>
</converter>
</faces-config>
Voilà。