时间:2017/8/9-15;郑州;报警接口实现。
由于java仅仅入门,并且开发设计经验不足,导致简单的项目也要花费大量的时间去堆积,但是收获还是很大的。
组织上给的任务很适合新手,而且善于引导,乐于助人。
接口的目的:统一的报警接口,实现邮件与短信通知。
遇到的困难:
spring-boot工程不会创建 安装完spring-boot相关插件后配置maven工程,新建maven工程。
不懂设计模式,看不懂多层次的包结构,和控制反转这些词的含义。
完全没有设计方法,浑水摸鱼。
经过两天的学习,终于把工程看懂了一点。大致又了解了eclipse的操作。
学习EA,画出类图,刚开始类图完全不会。就一个接口,然后一次次扩展。最终类图还是很简洁的。
经过抽取和封装终于看着有点像样了。对于spring-boot的开发架构有了一点了解,然后开始写代码。
刚开始是模仿前人的工程,先写出接口,最先的接口有sengWarning,sendMail,sendSMG,方法。
public boolean sendWarning(Warning warning) throws Exception{
transmit(getReceiver(warning.getTo()), warning.getTitle(), warning.getContent());
return true;
}
用了两个私有方法处理对象。然后对收件人进行处理,分割字符,为了简化操作,一开始是把to做成邮箱号码混合接受的字符串,再利用二维数组分割成邮件和短信两种,再用for循环每次发送一封信息。
这样做就是完全的没有设计模式的代码,几乎所有的代码都在接口实现类中实现,于是问人,大佬帮忙指出问题:收件人处理不实用,可以加个属性type来区分,方法的返回值最好别不要用二维数组(最好不要用,占地方),统一接口的报警应该有统一的返回值,所有的公共方法都应该加参数判断(这是因为只要是公共方法就有可能被调用)。
于是添加属性type;对type进行判断,区分功能;返回对象依旧不会处理,大佬指导,如果最终返回值是数组,就要反思是不是可以批量处理,于是找到,javamail是支持传入sring数组作为收件人信息的。而httpClient短信接口也有相应的配置,但是数据部分没有string数组的传送方法,想了很久,用for循环虽然可以做到发送,但是明显不是同步的,不能知道单个是否成功。后来终于通过查看源码,发现to是一个可以以“,”分割的多值输入。
对于多个对象的处理,首先应该想:是否存在批量的处理方法。没有批量的方法就要看属性是否支持多对象组合,如果都没有就自己建批量方法。
方法可以申请为静态,这是为了节省每次方法调用,但是有些对象要在方法中创建,这是防止修改静态对象被多线程干扰。
结果的返回值最好是封装成一个对象,这样有利于错误信息的查找。
对于所有公共方法,都要判断两次 :1、对象为空 2、值为空 最好采用
if(null == warning){
return new Result(false, "参数不合法", 1001);
}
//StringUtils.isBlank("");
if (null ==warning.getTo()|| "".equals(warning.getTo().trim())) {
return new Result(false, "收件人为空", 1002);
}
这样不会报空指针错误。
后面导师看代码,指出几个问题:fianl变量与静态变量定义重复,导致两个文件过耦合,最好删除一个;邮件与短信的返回值接受对象以及方法都具有共同点,可以抽取出抽象类,类中对象的初始化最好放在类中,不要定义在config类中。
最后又学习了一下测试工具postman和jmeter,json的书写格式{“”:“”,“”:“”}
注意事项: 配置文件中字符串不要加“”
post对象不能静态
非空判断很重要
异常申明用结果类代替
按多个字符分割spit("[,;]")
最后上代码
@Service
public class WarningServiceImpl implements WarningService {
private MSGUtil msgUtil;
/*信息发送入口
* warning 报警信息 boolean[] 按序返回结果
*/
@Override
public Result sendWarning(Warning warning) {
/*
* 判断对象为空?
*/
if (null == warning) {
return new Result(false, WarningReport.WARNINGFAILD);
}
/*
* 判断type :mail--邮件;msg--短信
*/
if ("mail".equals(warning.getType())) {
/*
* 邮件类对象调用
*/
msgUtil = new MailUtil();
} else if ("msg".equals(warning.getType())) {
/*
* 短信类对象调用
*/
msgUtil = new SMSUtil();
} else {
/*
* 邮件格式错误
*/
return new Result(false, WarningReport.FORMATERROR);
}
return msgUtil.getMSG(warning.getTo()
, warning.getTitle(), warning.getContent());
}
}
好了,终于完成第一篇了。希望开个好头。