编程填空:学生信息处理程序

这是Project Student的一部分。 其他职位包括带有Jersey的Webservice Client,带有Jersey的 Webservice Server和带有Spring Data的Persistence 。

RESTful Webapp洋葱的第三层是业务层。 这就是应用程序的精髓所在–编写良好的持久性和Web服务层受到约束,但是任何事情都在业务层中进行。

此时我们仅实现CRUD方法,因此这些方法非常简单。

设计决策

Spring Data –我们将使用Spring Data作为持久层,因此我们需要牢记指定持久层接口。 正如我们将在下一个博客中看到的那样,这大大简化了我们的生活。

局限性

DataAccessException –不会尝试根据我们收到的DataAccessException的类型抛出不同的异常。 稍后这将很重要-我们应该以不同于丢失数据库连接的方式对待约束违反。

服务介面

首先提醒我们在上一篇文章中确定的服务接口。

public interface CourseService {List<Course> findAllCourses();Course findCourseById(Integer id);Course findCourseByUuid(String uuid);Course createCourse(String name);Course updateCourse(Course course, String name);void deleteCourse(String uuid);
}

服务实施

由于服务是基本的CRUD操作,因此该服务的实施速度很快。 我们唯一关心的是数据库是否存在问题(Spring中的DataAccessException)或找不到期望值。 我们需要在前者的API中添加新的例外,而后者的API中已经有例外。

public class CourseServiceImpl implements CourseService {private static final Logger log = LoggerFactory.getLogger(CourseServiceImpl.class);@Resourceprivate CourseRepository courseRepository;/*** Default constructor*/public CourseServiceImpl() {}/*** Constructor used in unit tests*/CourseServiceImpl(CourseRepository courseRepository) {this.courseRepository = courseRepository;}/*** @see com.invariantproperties.sandbox.student.business.CourseService#*      findAllCourses()*/@Transactional(readOnly = true)@Overridepublic List<Course> findAllCourses() {List<Course> courses = null;try {courses = courseRepository.findAll();} catch (DataAccessException e) {if (!(e instanceof UnitTestException)) {log.info("error loading list of courses: " + e.getMessage(), e);}throw new PersistenceException("unable to get list of courses.", e);}return courses;}/*** @see com.invariantproperties.sandbox.student.business.CourseService#*      findCourseById(java.lang.Integer)*/@Transactional(readOnly = true)@Overridepublic Course findCourseById(Integer id) {Course course = null;try {course = courseRepository.findOne(id);} catch (DataAccessException e) {if (!(e instanceof UnitTestException)) {log.info("internal error retrieving course: " + id, e);}throw new PersistenceException("unable to find course by id", e, id);}if (course == null) {throw new ObjectNotFoundException(id);}return course;}/*** @see com.invariantproperties.sandbox.student.business.CourseService#*      findCourseByUuid(java.lang.String)*/@Transactional(readOnly = true)@Overridepublic Course findCourseByUuid(String uuid) {Course course = null;try {course = courseRepository.findCourseByUuid(uuid);} catch (DataAccessException e) {if (!(e instanceof UnitTestException)) {log.info("internal error retrieving course: " + uuid, e);}throw new PersistenceException("unable to find course by uuid", e,uuid);}if (course == null) {throw new ObjectNotFoundException(uuid);}return course;}/*** @see com.invariantproperties.sandbox.student.business.CourseService#*      createCourse(java.lang.String)*/@Transactional@Overridepublic Course createCourse(String name) {final Course course = new Course();course.setName(name);Course actual = null;try {actual = courseRepository.saveAndFlush(course);} catch (DataAccessException e) {if (!(e instanceof UnitTestException)) {log.info("internal error retrieving course: " + name, e);}throw new PersistenceException("unable to create course", e);}return actual;}/*** @see com.invariantproperties.sandbox.course.persistence.CourseService#*      updateCourse(com.invariantproperties.sandbox.course.domain.Course,*      java.lang.String)*/@Transactional@Overridepublic Course updateCourse(Course course, String name) {Course updated = null;try {final Course actual = courseRepository.findCourseByUuid(course.getUuid());if (actual == null) {log.debug("did not find course: " + course.getUuid());throw new ObjectNotFoundException(course.getUuid());}actual.setName(name);updated = courseRepository.saveAndFlush(actual);course.setName(name);} catch (DataAccessException e) {if (!(e instanceof UnitTestException)) {log.info("internal error deleting course: " + course.getUuid(),e);}throw new PersistenceException("unable to delete course", e,course.getUuid());}return updated;}/*** @see com.invariantproperties.sandbox.student.business.CourseService#*      deleteCourse(java.lang.String)*/@Transactional@Overridepublic void deleteCourse(String uuid) {Course course = null;try {course = courseRepository.findCourseByUuid(uuid);if (course == null) {log.debug("did not find course: " + uuid);throw new ObjectNotFoundException(uuid);}courseRepository.delete(course);} catch (DataAccessException e) {if (!(e instanceof UnitTestException)) {log.info("internal error deleting course: " + uuid, e);}throw new PersistenceException("unable to delete course", e, uuid);}}
}

该实现告诉我们持久层所需的接口。

持久层接口

我们将在持久层中使用Spring Data,并且DAO接口与Spring Data存储库相同。 我们只需要一种非标准方法。

public class CourseServiceImplTest {@Testpublic void testFindAllCourses() {final List<Course> expected = Collections.emptyList();final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findAll()).thenReturn(expected);final CourseService service = new CourseServiceImpl(repository);final List<Course> actual = service.findAllCourses();assertEquals(expected, actual);}@Test(expected = PersistenceException.class)public void testFindAllCoursesError() {final List<Course> expected = Collections.emptyList();final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findAll()).thenThrow(new UnitTestException());final CourseService service = new CourseServiceImpl(repository);final List<Course> actual = service.findAllCourses();assertEquals(expected, actual);}@Testpublic void testFindCourseById() {final Course expected = new Course();expected.setId(1);final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findOne(any(Integer.class))).thenReturn(expected);final CourseService service = new CourseServiceImpl(repository);final Course actual = service.findCourseById(expected.getId());assertEquals(expected, actual);}@Test(expected = ObjectNotFoundException.class)public void testFindCourseByIdMissing() {final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findOne(any(Integer.class))).thenReturn(null);final CourseService service = new CourseServiceImpl(repository);service.findCourseById(1);}@Test(expected = PersistenceException.class)public void testFindCourseByIdError() {final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findOne(any(Integer.class))).thenThrow(new UnitTestException());final CourseService service = new CourseServiceImpl(repository);service.findCourseById(1);}@Testpublic void testFindCourseByUuid() {final Course expected = new Course();expected.setUuid("[uuid]");final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(expected);final CourseService service = new CourseServiceImpl(repository);final Course actual = service.findCourseByUuid(expected.getUuid());assertEquals(expected, actual);}@Test(expected = ObjectNotFoundException.class)public void testFindCourseByUuidMissing() {final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(null);final CourseService service = new CourseServiceImpl(repository);service.findCourseByUuid("[uuid]");}@Test(expected = PersistenceException.class)public void testFindCourseByUuidError() {final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenThrow(new UnitTestException());final CourseService service = new CourseServiceImpl(repository);service.findCourseByUuid("[uuid]");}@Testpublic void testCreateCourse() {final Course expected = new Course();expected.setName("name");expected.setUuid("[uuid]");final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.saveAndFlush(any(Course.class))).thenReturn(expected);final CourseService service = new CourseServiceImpl(repository);final Course actual = service.createCourse(expected.getName());assertEquals(expected, actual);}@Test(expected = PersistenceException.class)public void testCreateCourseError() {final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.saveAndFlush(any(Course.class))).thenThrow(new UnitTestException());final CourseService service = new CourseServiceImpl(repository);service.createCourse("name");}@Testpublic void testUpdateCourse() {final Course expected = new Course();expected.setName("Alice");expected.setUuid("[uuid]");final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(expected);when(repository.saveAndFlush(any(Course.class))).thenReturn(expected);final CourseService service = new CourseServiceImpl(repository);final Course actual = service.updateCourse(expected, "Bob");assertEquals("Bob", actual.getName());}@Test(expected = ObjectNotFoundException.class)public void testUpdateCourseMissing() {final Course expected = new Course();final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(null);final CourseService service = new CourseServiceImpl(repository);service.updateCourse(expected, "Bob");}@Test(expected = PersistenceException.class)public void testUpdateCourseError() {final Course expected = new Course();expected.setUuid("[uuid]");final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(expected);doThrow(new UnitTestException()).when(repository).saveAndFlush(any(Course.class));final CourseService service = new CourseServiceImpl(repository);service.updateCourse(expected, "Bob");}@Testpublic void testDeleteCourse() {final Course expected = new Course();expected.setUuid("[uuid]");final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(expected);doNothing().when(repository).delete(any(Course.class));final CourseService service = new CourseServiceImpl(repository);service.deleteCourse(expected.getUuid());}@Test(expected = ObjectNotFoundException.class)public void testDeleteCourseMissing() {final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(null);final CourseService service = new CourseServiceImpl(repository);service.deleteCourse("[uuid]");}@Test(expected = PersistenceException.class)public void testDeleteCourseError() {final Course expected = new Course();expected.setUuid("[uuid]");final CourseRepository repository = Mockito.mock(CourseRepository.class);when(repository.findCourseByUuid(any(String.class))).thenReturn(expected);doThrow(new UnitTestException()).when(repository).delete(any(Course.class));final CourseService service = new CourseServiceImpl(repository);service.deleteCourse(expected.getUuid());}
}

整合测试

集成测试已推迟到实现持久层。

源代码

  • 可从http://code.google.com/p/invariant-properties-blog/source/browse/student/student-business获得源代码。
参考: 项目学生:来自Invariant Properties博客的JCG合作伙伴 Bear Giles的业务层 。

翻译自: https://www.javacodegeeks.com/2014/01/project-student-business-layer.html

编程填空:学生信息处理程序

编程填空:学生信息处理程序_项目学生:业务层相关推荐

  1. 第二周测验 001:编程填空:学生信息处理程序

    总时间限制:  1000ms 内存限制:  1024kB 描述 实现一个学生信息处理程序,计算一个学生的四年平均成绩. 要求实现一个代表学生的类,并且类中所有成员变量都是[私有的]. 补充下列程序中的 ...

  2. 编程作业—C++初探 简单的学生信息处理程序实现

    简单的学生信息处理程序实现 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...

  3. C:简单的学生信息处理程序实现

    描述 在一个学生信息处理程序中,要求实现一个代表学生的类,并且所有成员变量都应该是私有的. (注:评测系统无法自动判断变量是否私有.我们会在结束之后统一对作业进行检查,请同学们严格按照题目要求完成,否 ...

  4. 学生信息管理系统-web项目实训(基于JAVA)

    学生信息管理系统-web项目实训(基于JAVA) //登陆 package rjgc;import java.awt.*; import java.awt.event.*; import javax. ...

  5. 上海交通大学出版社python教材答案学生信息管理系统_学生信息管理系统(最终版)...

    <学生信息管理系统.doc>由会员分享,可免费在线阅读全文,更多与<学生信息管理系统(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索. 1. ...

  6. java查询学生信息_分别显示女生_女生学生基本信息的代码_java课程设计学生信息管理系统_毕业论文.doc...

    java课程设计学生信息管理系统_毕业论文 学 号: 课 程 设 计 题 目学生信息管理系统学 院计算机科学与信息工程学院专 业金融信息化服务外包班 级学生姓名指导教师 2015年12月28日 课程设 ...

  7. 基于C语言的学生信息管理系统_(更新版)_(附源码和安装包)_课程设计_☆*往事随風*☆的博客

    学生信息管理系统 一.需求 基于C语言编写一个学生信息管理系统来实现对学生成绩的管理(数学.C语言.英语),系统要能够实现基本的增.删.改.查等功能,在此基础上还可以自由发挥,要求使用到数组.文件.排 ...

  8. 显示学生信息的C语言,学生信息管理系统C语言.doc

    学生信息管理系统C语言 学生信息管理系统 摘要 由于学校规模进一步扩大,学生人数逐年上升,学生信息的管理也变得越来越复杂,切实有效的把学生信息管理系统引入学校教务管理中,对于促进学校管理制度和提高学校 ...

  9. JAVA JSP学生信息档案管理系统JSP学生管理系统JSP学生档案管理系统JSP学生信息管理系统

    JAVA JSP学生信息档案管理系统JSP学生管理系统JSP学生档案管理系统JSP学生信息管理系统 protected void doGet(HttpServletRequest req, HttpS ...

最新文章

  1. 记一例 ORA-00904:标识符无效
  2. SpringBoot文件上传时提示FileUploadBase$SizeLimitExceed
  3. Java多线程之线程通信之生产者消费者阻塞队列版
  4. python from sys import argv_笨方法学python之import sys与from sys import argv的区别
  5. jquery --- pip方法
  6. Cannot obtain primary key information from the database, generated objects may be incomplete
  7. Python小白的数学建模课-15.图论的基本概念
  8. SPS中计算值公式函数简介
  9. MYSQL5.6服务启动不起来
  10. python 字节字符串_Python字符串转换为字节,字节转换为字符串
  11. 解决C#网络通信编程的阻塞问题
  12. 在linux内核中修改TCP MSS值
  13. HTML5中 audio标签的样式修改
  14. 外贸常用术语_常用外贸术语
  15. nano编辑器保存退出
  16. 智力题、推理判断题、数量关系题(三)
  17. android中drawable的自建资源
  18. 腾讯提出共享 AI,抢先布局游戏与多媒体 AI,首秀同声传译
  19. play框架使用起来(16)
  20. Delta3d 2.8 版本终于发版

热门文章

  1. 14、ORACLE下的基本SQL操作
  2. mybatis源码阅读(一):SqlSession和SqlSessionFactory
  3. Java集合面试问题
  4. JavaScript学习总结(九)——Javascript面向(基于)对象编程
  5. Spring快速开启计划任务
  6. C++描述杭电OJ 2021.发工资 ||
  7. 老师 累了,我们 泪了!
  8. 利用bootstraptable展示数据,对数据进行排序分页等操作
  9. ssm(Spring+Spring mvc+mybatis)——web.xml
  10. Axios实现异步通信