我正在尝试创建一个验证java类,它接收来自请求者传递为1的对象的4个输入。该类需要将浮点输入转换为字符串并评估每个输入以满足某种格式,然后在失败时抛出包含错误消息和代码的异常。
我所拥有的是两种方法,并且想知道是否有更好的方法将这两个类组合成一个用于调用主类的验证方法。我似乎无法使用模式/匹配器概念来确保输入格式正确。非常感谢您提供的任何帮助。
public class Validator {
private static final String MoneyPattern ="^\\d{1,7}(\\.\\d{1,2})$" ;
private static final String PercentagePattern = "^\\d{1,3}\\.\\d{1,2}$";
private static final String CalendarYearPattern = "^20[1-9][0-9]$";
private int errorcode = 0;
private String errormessage = null;
public Validator(MyInput input){
}
private boolean verifyInput(){
String Percentage = ((Float) input.getPercentage().toString();
String Income = ((Float) input.getIncome().toString();
String PublicPlan = ((Float) input.getPublicPlan().toString();
String Year = ((Float) input.getYear();
try {
if (!doesMatch(Income, MoneyPattern)) {
errormessage = errormessage + "income,";
}
if (!doesMatch(PublicPlan, MoneyPattern)) {
errormessage = errormessage + "insurance plan,";
}
if (!doesMatch(Percentage, PercentagePattern)) {
errormessage = errormessage + "Percentage Plan,";
}
if (!doesMatch(Year, CalendarYearPattern)) {
errormessage = errormessage + "Year,";
}
} catch (Exception e){
errorcode = 111;
errormessage = e.getMessage();
}
}
private boolean doesMatch(String s, String pattern) throws Exception{
try {
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(s);
if (!s.equals("")){
if(m.find()){
return true;
} else {
return false;
}
}else {
return false;
}
} catch (PatternSyntaxException pse){
errorcode = 111;
errormessage = pse.getMessage();
}
}
}
答案 0 :(得分:0)
此代码来自“go”一词。你有一个构造函数,你传递MyInput
引用,但ctor中没有代码,也没有私有数据成员接收它。看起来您希望在doesMatch(
)方法中使用输入,但它等待NullPointerException
。
您的代码不符合Sun Java编码标准;变量名称应为小写。
为什么当你真正收到价值时,你不会在ctor中进行输入验证,这超出了我的意思。也许你真的想将它传递给verifyInput()
方法。
在关注自己的效率之前,我会担心正确性和可读性。
我有这样的方法:
public boolean isValidMoney(String money) { // put the regex here }
public boolean isValidYear(String year) { // the regex here }
我认为我更喜欢真正的Money类到String。没有任何抽象。
这是一点诚实:
private static final String CalendarYearPattern = "^20[1-9][0-9]$";
我想你或者不认为这段代码仍然会在22世纪运行,或者你不会在这里维护它。
答案 1 :(得分:0)
这样做的一种方法是使用DynamicBeans。
package com.acme.validator;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.beanutils.PropertyUtils;
public class Validator {
//A simple optimisation of the pattern
private static final Pattern MoneyPattern = Pattern.compile("^\\d{1,7}(\\.\\d{1,2})$");
private static final Pattern PercentagePattern = Pattern.compile("^\\d{1,3}\\.\\d{1,2}$");
private static final Pattern CalendarYearPattern = Pattern.compile("^20[1-9][0-9]$");
public String Validator(MyInput input) {
String errormessage = "";
/*
* Setting these up as Maps.
* Ideally this would be a 'simple bean'
* but that goes beyond the scope of the
* original question
*/
Map<String,Pattern> patternMap = new HashMap<String,Pattern>();
patternMap.put("percentage", PercentagePattern);
patternMap.put("publicPlan", MoneyPattern);
patternMap.put("income", MoneyPattern);
patternMap.put("year", CalendarYearPattern);
Map<String,String> errorMap = new HashMap<String,String>();
errorMap.put("percentage", "Percentage Plan,");
errorMap.put("publicPlan", "insurance plan,");
errorMap.put("income", "income,");
errorMap.put("year", "Year,");
for (String key : patternMap.keySet()) {
try {
String match = ((Float) PropertyUtils.getSimpleProperty(input, key)).toString();
Matcher m = patternMap.get(key).matcher(match);
if ("".equals(match) || !m.find()) {
errormessage = errormessage + errorMap.get(key);
}
} catch (Exception e) {
errormessage = e.getMessage(); //since getMessage() could be null, you need to work out some way of handling this in the response
//don't know the point of the error code so remove this altogether
break; //Assume an exception trumps any validation failure
}
}
return errormessage;
}
}
我对验证规则做了一些假设(为简单起见,使用了2个映射,但你也可以使用单个映射和包含Pattern和Message的bean,如果这很重要,甚至可以使用'错误代码')
原始设置中的关键“缺陷”以及阻碍上述解决方案的因素是您在输入bean中使用'year'作为Float。
(new Float(2012)).toString()
以上返回“2012.0”。这总是会使你的模式失败。当您开始讨论输入bean中可能存在的不同类型的对象时,您可能需要考虑在创建输入bean时确保它们是String,而不是像检索它们时的情况那样。
祝你的其他Java经验好运。