
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 spring Boot 特点 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 。。。。。。 maven项目创建 1、访问http://start.spring.io/ 2、选择构建工具Maven Project、Spring Boot版本1.3.6以及一些工程基本信息,点击“Switch to the full version.”java版本选择1.7,可参考下图所示: 3、点击Generate Project下载项目压缩包 4、解压后,使用eclipse,Import -> Existing Maven Projects -> Next ->选择解压后的文件夹-> Finsh,OK done! 项目结构介绍 如上图所示,Spring Boot的基础结构共三个文件: src/main/java 程序开发以及主程序入口 src/main/resources 配置文件 src/test/java 测试程序 另外,spingboot建议的目录结果如下:root package结构:com.example.myproject com +- example +- myproject +- Application.java | +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- controller | +- CustomerController.java | 1、Application.java 建议放到根目录下面,主要用于做一些框架配置 2、domain目录主要用于实体(Entity)与数据访问层(Repository) 3、service 层主要是业务类代码 4、controller 负责页面访问控制 采用默认配置可以省去很多配置,当然也可以根据自己的喜欢来进行更改最后,启动Application main方法,至此一个java项目搭建好了! 引入web模块 1、pom.xml中添加支持web的模块: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> pom.xml文件中默认有两个模块: spring-boot-starter :核心模块,包括自动配置支持、日志和YAML; spring-boot-starter-test :测试模块,包括JUnit、Hamcrest、Mockito。 2、编写controller内容: @RestController public class HelloWorldController { @RequestMapping("/hello") public String index() { return "Hello World"; } } @RestController 的意思就是controller里面的方法都以json格式输出,不用再写什么jackjson配置的了! 3、启动主程序,打开浏览器访问http://localhost:8080/hello,就可以看到效果了,有木有很简单! 如何做单元测试 打开的src/test/下的测试入口,编写简单的http请求来测试;使用mockmvc进行,利用MockMvcResultHandlers.print()打印出执行结果。 @RunWith(SpringRunner.class) @SpringBootTest public class HelloTests { private MockMvc mvc; @Before public void setUp() throws Exception { mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build(); } @Test public void getHello() throws Exception { mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().string(equalTo("Hello World"))); } } 开发环境的调试 热启动在正常开发项目中已经很常见了吧,虽然平时开发web项目过程中,改动项目启重启总是报错;但springBoot对调试支持很好,修改之后可以实时生效,需要添加以下的配置: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> </plugins> </build> 该模块在完整的打包环境下运行的时候会被禁用。如果你使用java -jar启动应用或者用一个特定的classloader启动,它会认为这是一个“生产环境”。 总结 使用spring boot可以非常方便、快速搭建项目,使我们不用关心框架之间的兼容性,适用版本等各种问题,我们想使用任何东西,仅仅添加一个配置就可以,所以使用sping boot非常适合构建微服务。 学习文章来自 :springboot(一)入门篇 一边学习一边记录。看了就忘了,就还是自己敲敲代码,记录学习的过程。
我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
今天被自己给蠢死了 今天在代码中遇到这个错误, 百度翻译一下:映射方法,从一org.system.mapper.child.chmorganizationexaminationmapper.delete返回零作为一个原始的方法的返回类型(int)。 org.apache.ibatis.binding.BindingException: Mapper method 'org.system.mapper.child.ChmOrganizationExaminationMapper.delete attempted to return null from a method with a primitive return type (int). at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:83) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) at com.sun.proxy.$Proxy44.delete(Unknown Source) at org.system.service.impl.child.ChmOrganizationExaminationService.deleteChmOrganizationExamination(ChmOrganizationExaminationService.java:24) at org.system.service.impl.child.ChmOrganizationExaminationService$$FastClassBySpringCGLIB$$a406e58d.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) at org.system.service.impl.child.ChmOrganizationExaminationService$$EnhancerBySpringCGLIB$$7bf0512.deleteChmOrganizationExamination(<generated>) at org.system.controller.impl.child.ChmOrganizationExaminationController.insertChmOrganizationExamination(ChmOrganizationExaminationController.java:35) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.system.intercept.ValidInterceptor.invoke(ValidInterceptor.java:63) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) at com.sun.proxy.$Proxy96.insertChmOrganizationExamination(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) 最后发现的mapper.xml 代码是这样写的:居然用的select。 <select id="delete" parameterType="org.system.entity.child.ChmTransferOrganization"> DELETE FROM chm_organization_examination WHERE organization_id=#{organizationId} </select> 真的是蠢到家了!
触发器通用属性: jobKey:表示job实例的标识,触发器被触发时,指定的job实例会被执行。 startTime:表示触发器的时间表 首次被触发的时间,他的值类型为java.uti.Date。 endTime:指定的触发器不在被执行的时间,他的值类型为java.uti.Date。 实现: package quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class SchedulerClass { public static void main(String[] args) throws SchedulerException { Date startDate = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("当前时间:"+sf.format(startDate)); // 创建一个JobDetail实例 // 将该实例与JobClass绑定,JobDetail是由Builder模式来创建的,JobDetail是来绑定job的。 // withIdentity 创建唯一的标识 JobDetail jobDetail = JobBuilder.newJob(JobClass.class).withIdentity("jobName", "group").build(); /*获取当前三秒后的时间*/ startDate.setTime(startDate.getTime()+3000); /*获取当前六秒后的时间*/ Date endDate = new Date(); endDate.setTime(endDate.getTime()+6000); // 创建一个Tigger实例,定义 job立即执行,并每隔一段时间重复执行,每隔5秒中执行一次 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger").startAt(startDate).endAt(endDate) .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build(); // 创建一个Scheduler实例, Scheduler是由工厂模式来创建的 so SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler(); scheduler.start(); // 调度器调用任务和触发器,scheduler将job,trigger绑定在一起。 scheduler.scheduleJob(jobDetail, trigger); } } package quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobDetail; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.Trigger; public class JobClass implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { Date date=new Date(); SimpleDateFormat sf=new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); System.out.println("执行时间:"+sf.format(date)); // 编写业务逻辑 System.out.println("hello Quartz"); JobKey jobKey=arg0.getJobDetail().getKey(); Trigger triiger=arg0.getTrigger(); System.out.println("开始时间"+sf.format(triiger.getStartTime())); System.out.println("结束时间"+sf.format(triiger.getEndTime())); System.out.println("实例名称:"+jobKey.getName()); } } 执行结果为: SimpleTrigger 作用:在指定的时间段内执行一次作业任务 或是 在指定的时间间隔内执行多次作业任务 (定时定频率) // 定时 当前时间3秒后执行 startDate.setTime(startDate.getTime() + 3000); // Trigger trigger =TriggerBuilder.newTrigger().withIdentity("trigger").startAt(startDate).build(); // 定频率 每隔3秒中执行一次,执行2次 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger").startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).withRepeatCount(2)).build(); 注意: 重复次数,可以是0、正整数,以及常量SimpleTrigger.REPEAT_INDEFINITELY。重复的间隔,必须是0,或者long型的正数,表示毫秒。注意,如果重复间隔为0,trigger将会以重复次数并发执行(或者以scheduler可以处理的近似并发数)。 endTime属性的值会覆盖设置重复次数的属性值;比如,你可以创建一个trigger,在终止时间之前每隔10秒执行一次,你不需要去计算在开始时间和终止时间之间的重复次数,只需要设置终止时间并将重复次数设置为REPEAT_INDEFINITELY(当然,你也可以将重复次数设置为一个很大的值,并保证该值比trigger在终止时间之前实际触发的次数要大即可)。 CronTrigger:基于日历的作业调度器。 Cron表达式: 用于配置CronTrigger实例。由7个子表达式组成的字符串,描述时间表的详细信息,格式:秒 分 时 日 月 周 年 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger") .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).build(); 通配符说明 实在是不知道怎么写 网上搜搜 cron在线生成表达式。
1 我们使用maven项目 2 创建一个job类,在execute()方法里写上业务逻辑代码。 3 在另外一个类中创建触发器,调度器,并且绑定job。 首先在项目的pom.xml引入需要的jar包。 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency> 创建一个job package quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class JobClass implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { Date date=new Date(); SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("当前时间为:"+sf.format(date)); // 编写业务逻辑 System.out.println("hello Quartz"); } } 再创建另外一个类 package quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class SchedulerClass { public static void main(String[] args) throws SchedulerException { // 创建一个JobDetail实例 将该实例与JobClass绑定,JobDetail是由Builder模式来创建的,JobDetail是来绑定job的。 // withIdentity 创建唯一的标识 JobDetail jobDetail = JobBuilder.newJob(JobClass.class).withIdentity("job").build(); // 创建一个Tigger实例,定义 job立即执行,并每隔一段时间重复执行,每隔5秒中执行一次 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger").startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build(); // 创建一个Scheduler实例, Scheduler是由工厂模式来创建的 so SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler(); scheduler.start(); Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("当前时间为:" + sf.format(date)); //调度器调用任务和触发器,scheduler将job,trigger绑定在一起。 scheduler.scheduleJob(jobDetail, trigger); } } 但是这样看起来很复杂的!