如何使用或自定义javax.faces.convert.BigDecimalConverter

时间:2013-10-16 09:05:12

标签: jsf jsf-2

我需要在我的一个JSF应用程序中使用BigDecimal类型 所以我使用BigDecimal Converter进行转换,如下所示:

<h:inputText value="#{priceManager.price}">
    <f:converter converterId="javax.faces.BigDecimal"/>
</h:inputText>

这很好用 除了这个转换,我还想限制

  • 值必须介于-9999至9999.和
  • 之间
  • 小数点后只有2个数字。

显然f:converter f:convertNumber不够灵活{。}} 那么如何实现上述目标呢? 如果它需要覆盖默认的转换器,我会这样做,但我以前从未这样做过。
请给我一些建议。

Mojarra版本 - 2.1

2 个答案:

答案 0 :(得分:3)

我不知道这是一个好习惯,让转换器进行验证,但这是我看到的最干净的方式。这个转换器对我来说很好:

package teststuff;

import java.math.BigDecimal;
import java.math.RoundingMode;

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.apache.commons.lang3.math.NumberUtils;

@FacesConverter("bigDecimalConverter")
public class BigDecimalConverter implements Converter {

    private static final BigDecimal UPPER_LIMIT = new BigDecimal(9999);
    private static final BigDecimal LOWER_LIMIT = new BigDecimal(-9999);

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        if (!NumberUtils.isNumber(value)) {
            throw new ConverterException(new FacesMessage("not a number"));
        }
        if (value.contains(".")) {
            String decimalPlace = value.substring(value.indexOf("."));
        if (decimalPlace.length() > 3) { // 3 as decimal point is included in the String
                throw new ConverterException(new FacesMessage(
                        "too many numbers after decimal point"));
            }
        }
        BigDecimal convertedValue = new BigDecimal(value).setScale(2,
                RoundingMode.HALF_UP);
        if (convertedValue.compareTo(UPPER_LIMIT) > 0) {
            throw new ConverterException(new FacesMessage(
                    "value may not be greater than " + UPPER_LIMIT));
        }
        if (convertedValue.compareTo(LOWER_LIMIT) < 0) {
            throw new ConverterException(new FacesMessage(
                    "value may not be less than " + LOWER_LIMIT));
        }
        return convertedValue;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        return ((BigDecimal) value).toString();
    }
}

我只是这样使用它:

<h:form>
       <h:inputText value="#{priceManager.price}" converter="bigDecimalConverter"/>
       <h:messages/>
       <h:commandButton value="submit"/>
    </h:form>

我很感激您的任何反馈。

答案 1 :(得分:1)

@FacesConverter("bigDecimalConverter")
public class BigDecimalCoverter implements Converter{        

    @Override
     public Object getAsObject(FacesContext context, UIComponent component,
       String value) {
            BigDecimal valueDecimal=(BigDecimal)value;  
            if(valueDecimal.compareTo(valueDecimal)>9999 && valueDecimal.compareTo(valueDecimal)<-9999){
                 valueDecimal.setScale(2, RoundingMode.CEILING)
            }
            else{                       
                FacesMessage msg = new FacesMessage("Number not in range");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ConverterException(msg);                   
            }       
            return valueDecimal;
       }

        @Override
        public String getAsString(FacesContext context, UIComponent component,
            Object value) {
            return value.toString();

        }   
  }

并放置

  <h:inputText value="#{priceManager.price}">
   <f:converter converterId="bigDecimalConverter"/>
 </h:inputText>