我需要在我的一个JSF应用程序中使用BigDecimal类型 所以我使用BigDecimal Converter进行转换,如下所示:
<h:inputText value="#{priceManager.price}">
<f:converter converterId="javax.faces.BigDecimal"/>
</h:inputText>
这很好用 除了这个转换,我还想限制
显然f:converter
f:convertNumber
不够灵活{。}}
那么如何实现上述目标呢?
如果它需要覆盖默认的转换器,我会这样做,但我以前从未这样做过。
请给我一些建议。
Mojarra版本 - 2.1
答案 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>