Giter VIP home page Giter VIP logo

spring-boot-api-project-seed's Introduction

Licence GitHub Release

简介

Spring Boot API Project Seed 是一个基于Spring Boot & MyBatis的种子项目,用于快速构建中小型API、RESTful API项目,该种子项目已经有过多个真实项目的实践,稳定、简单、快速,使我们摆脱那些重复劳动,专注于业务代码的编写,减少加班。下面是一个简单的使用演示,看如何基于本项目在短短几十秒钟内实现一套简单的API,并运行提供服务。

请选择超清

特征&提供

  • 最佳实践的项目结构、配置文件、精简的POM(查看项目结构图
  • 统一响应结果封装及生成工具
  • 统一异常处理
  • 简单的接口签名认证
  • 常用基础方法抽象封装
  • 使用Druid Spring Boot Starter 集成Druid数据库连接池与监控
  • 使用FastJsonHttpMessageConverter,提高JSON序列化速度
  • 集成MyBatis、通用Mapper插件、PageHelper分页插件,实现单表业务零SQL
  • 提供代码生成器根据表名生成对应的Model、Mapper、MapperXML、Service、ServiceImpl、Controller等基础代码,其中Controller模板默认提供POST和RESTful两套,根据需求在CodeGenerator.genController(tableName)方法中自己选择,默认使用POST模板。代码模板可根据实际项目的需求来扩展,由于每个公司业务都不太一样,所以只提供了一些比较基础、通用的模板,主要是提供一个思路来减少重复代码的编写,我在实际项目的使用中,其实根据公司业务的抽象编写了大量的模板。另外,使用模板也有助于保持团队代码风格的统一
  • 另有彩蛋,待你探索  

快速开始

  1. 克隆项目
  2. test包内的代码生成器CodeGenerator进行配置,主要是JDBC,因为要根据表名来生成代码
  3. 如果只是想根据上面的演示来亲自试试的话可以使用test resources目录下的demo-user.sql,否则忽略该步
  4. 输入表名,运行CodeGenerator.main()方法,生成基础代码(可能需要刷新项目目录才会出来)
  5. 根据业务在基础代码上进行扩展
  6. 对开发环境配置文件application-dev.properties进行配置,启动项目,Have Fun!  

开发建议

  • 表名,建议使用小写,多个单词使用下划线拼接
  • Model内成员变量建议与表字段数量对应,如需扩展成员变量(比如连表查询)建议创建DTO,否则需在扩展的成员变量上加@Transient注解,详情见通用Mapper插件文档说明
  • 建议业务失败直接使用ServiceException("message")抛出,由统一异常处理器来封装业务失败的响应结果,比如throw new ServiceException("该手机号已被注册"),会直接被封装为{"code":400,"message":"该手机号已被注册"}返回,无需自己处理,尽情抛出
  • 需要工具类的话建议先从apache-commons-*guava中找,实在没有再造轮子或引入类库,尽量精简项目
  • 开发规范建议遵循阿里巴巴Java开发手册(最新版下载)
  • 建议在公司内部使用ShowDocSpringFox-Swagger2RAP等开源项目来编写、管理API文档  

技术选型&文档

License

无,纯粹开源分享,感谢大家 Star & Fork 的支持。

spring-boot-api-project-seed's People

Contributors

lihengming avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

spring-boot-api-project-seed's Issues

service通用方法问题

在controller里面使用具体的service对象去调用AbstractService里面通用的方法返回的单条数据或者是列表,无法使用fastjson进行序列化到前端

关于如何对该种子项目进行改造以适应于前台项目、后台管理项目的解答

有很多开发者朋友问我有没有类似的前台项目、后台管理项目的种子项目,其实都是类似的,区别在于这些项目需要模版引擎(不建议使用JSP)和静态资源(css、js、img)的支持,稍微调整下即可适用,按照MVC的分层来说的话差异的只是视图层,下面是基于Thymleaf模板引擎的改造步骤,供参考。

  1. 加入Thymleaf模板引擎依赖
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 去除以下配置项
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
  1. 调整统一异常处理器,增加404、500页面支持
   //统一异常处理
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
        exceptionResolvers.add(new HandlerExceptionResolver() {
            public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
                ModelAndView mv = new ModelAndView();
                Result result = new Result();
                if (handler instanceof HandlerMethod) {
                    HandlerMethod handlerMethod = (HandlerMethod) handler;
                    if (null != handlerMethod.getBean().getClass().getAnnotation(RestController.class)
                            || null != handlerMethod.getMethodAnnotation(ResponseBody.class)) {//JSON视图
                        if (e instanceof ServiceException) {//业务失败的异常,如“账号或密码错误”
                            result.setCode(ResultCode.FAIL).setMessage(e.getMessage());
                            logger.info(e.getMessage());
                        } else if (e instanceof ServletException) {
                            result.setCode(ResultCode.FAIL).setMessage(e.getMessage());
                        } else {
                            result.setCode(ResultCode.INTERNAL_SERVER_ERROR).setMessage("接口 [" + request.getRequestURI() + "] 内部错误,请联系管理员");
                            String message = String.format("接口 [%s] 出现异常,方法:%s.%s,异常摘要:%s",
                                    request.getRequestURI(),
                                    handlerMethod.getBean().getClass().getName(),
                                    handlerMethod.getMethod().getName(),
                                    e.getMessage());
                            logger.error(message, e);
                        }
                        responseResult(response, result);
                    } else {//普通视图
                        if (response.getStatus() == 404) {
                            mv.setViewName("error/404");
                        } else {
                            mv.setViewName("error/500");
                            logger.error(e.getMessage(), e);
                        }
                    }
                } else {
                    mv.setViewName("error/500");
                    logger.error(e.getMessage(), e);
                }
                return mv;
            }
        });
    }
  1. 调整项目结构,增加static、templates目录,类似于下面这样
|   |   \---resources
|   |       \---mapper
|   |       |
|   |       \---static
|   |       |   \---css
|   |       |   \---img
|   |       |   \---js
|   |       \---templates
|   |           |   example.html
|   |           |
|   |           \---error
|   |                   404.html
|   |                   500.html
|   |       |   application.properties
|   |       |   application-dev.properties
|   |       |   application-pro.properties
|   |       |   application-test.properties
|   |       |   banner.txt

除了这些外,模板也需要调整,主要是Controller模板,根据自己的需求改一下,这里就不多说了。如果你在做的是后台项目的话,其实除了一些Java模板外还可以封装一些页面、JS代码模板,直接生成,毕竟后台系统大部分以增删改查为主很多管理页面是很类似的。当然,这只是一些基础改造,要想使用它开发前台项目、后台管理项目你还需要集成一些东西,比如通常需要集成Shiro来做权限控制、会话管理等。

注:在使用Spring Boot 开发项目时,如遇到页面、静态资源的修改刷新后不能立即生效的问题的话,你可以参考这篇文章:Spring Boot 静态资源无法热加载的解决方法

如何自定义Spring Boot启动Banner

The banner that is printed on start up can be changed by adding a banner.txt file to your classpath, or by setting banner.location to the location of such a file. If the file has an unusual encoding you can set banner.charset (default is UTF-8). In addition to a text file, you can also add a banner.gif, banner.jpg or banner.png image file to your classpath, or set a banner.image.location property. Images will be converted into an ASCII art representation and printed above any text banner.

Spring Boot 允许我们使用自定义的Banner,可以是文本或者图片格式,不过最终都会以ASCII的形式展现出来。你可以通过修改本项目resources目录下的banner.txt内的文本来更改它,下面这三个地址可以帮助你生成ASCII格式的文本。

更多关于Banner的信息,可以看看Spring Boot官方文档关于它的介绍,地址:http://docs.spring.io/spring-boot/docs/1.5.5.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-banner

运行2个小时左右,就会崩掉。很奇怪 :Invocation of destroy method 'close' failed on bean with name 'dataSource'

[ Thread-3] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@7591083d: startup date [Sun Sep 17 17:07:50 CST 2017]; root of context hierarchy

[ Thread-3] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
2017-09-17 19:19:20.197 INFO 24527 --- [ Thread-3] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans

[ Thread-3] o.s.b.f.support.DisposableBeanAdapter : Invocation of destroy method 'close' failed on bean with name 'dataSource': java.lang.NoClassDefFoundError: com/alibaba/druid/pool/PreparedStatementPool
Exception in thread "Thread-3" java.lang.NoClassDefFoundError: org/apache/catalina/Lifecycle$SingleUse
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:240)
at org.apache.catalina.startup.Tomcat.stop(Tomcat.java:354)

insertSelective如何返回主键ID?

用的oracle数据库,配置了ID是从sequence生成的,如下。
image
目前插入正常,返回值是1,应该是记录数。
如果需要返回生成的ID,能支持吗,应该怎么配置?

“cannot be cast to”异常

接口 [/user/list] 出现异常,方法:com.company.project.web.UserController.list,异常摘要:com.company.project.model.User cannot be cast to com.company.project.model.User

java.lang.ClassCastException: com.company.project.model.User cannot be cast to com.company.project.model.User
at com.alibaba.fastjson.serializer.ASMSerializer_3_User.write(Unknown Source) ~[na:na]
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:304) ~[fastjson-1.2.22.jar:na]
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:282) ~[fastjson-1.2.22.jar:na]
at com.alibaba.fastjson.serializer.ASMSerializer_2_PageInfo.write(Unknown Source) ~[na:na]
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:304) ~[fastjson-1.2.22.jar:na]
at com.alibaba.fastjson.serializer.ASMSerializer_1_Result.write(Unknown Source) ~[na:na]
at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:275) ~[fastjson-1.2.22.jar:na]
at com.alibaba.fastjson.JSON.writeJSONString(JSON.java:781) ~[fastjson-1.2.22.jar:na]
at com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4.writeInternal(FastJsonHttpMessageConverter4.java:82) ~[fastjson-1.2.22.jar:na]
at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:106) ~[spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:231) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:174) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81) ~[spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:113) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-embed-websocket-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15]
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) [druid-1.1.0.jar:1.1.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) [tomcat-embed-core-8.5.15.jar:8.5.15]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.15.jar:8.5.15]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.15.jar:8.5.15]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]

分页不行?

2017-07-04 00:12:24.154 ERROR 14120 --- [nio-8080-exec-1] c.c.project.configurer.WebMvcConfigurer : 接口 [/user/list] 出现异常,方法:com.company.project.web.UserController.list,异常摘要:null

java.lang.NullPointerException: null
at com.company.project.web.UserController.list(UserController.java:50) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_131]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_131]

T findBy(String fieldName, Object value) throws TooManyResultsException 异常

在项目我是下载的spring-boot-api-project-seed进行的一个尝试。在生成的代码以后调用
Service中封装好的T findBy(String fieldName, Object value) throws TooManyResultsException这个方法。就会抛出这个异常。不知道你们有木有遇见
java.lang.ClassCastException: com.company.project.model.UserInfo cannot be cast to com.company.project.model.UserInfo

解决使用 java -jar 启动应用时提示“没有主清单属性”的问题

因为我使用spring-boot-dependencies代替了spring-boot-starter-parent这个parent POM,解决方案见Spring Boot官方文档:

If you are not using the parent POM you can still use the plugin, however, you must additionally add an section:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.5.4.RELEASE</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

我考虑了下,还是使用spring-boot-starter-parent比较好,提供了很多标准的配置,并且包含spring-boot-dependencies。当然,这样的话你就不能继承你自己的parent POM了,不过一般中小型项目一般都没有自己的parent POM,所以应该没什么关系,真的需要修改为自己的parent POM的话,也很简单,删除spring-boot-starter-parent 改为spring-boot-dependencies即可,详细说明见官方文档说明

使用ORACLE报错: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigDecimal

异常:
接口 [/user/detail] 出现异常,方法:com.XXX.web.UserController.detail,异常摘要:nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='id', mode=IN, javaType=class java.math.BigDecimal, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #1 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigDecimal

环境:jdk1.8,intellij ide, oracle10

model里面生成的主键类型是BigDecimal :

@Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "select USERS_SEQ.nextval from dual")
    private BigDecimal id;
 

而controller里面的参数却是Integer

@GetMapping("/detail")
    public Result detail(@RequestParam Integer id) {
        User user = userService.findById(id);
        return ResultGenerator.genSuccessResult(user);
    }

数据库主键ID的类型是:NUMBER(38)

请问这个应该怎么处理呢?

代码复制下不能运行报错

image
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactoryBean' defined in class path resource [com/company/project/configurer/MybatisConfigurer.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactoryBean' threw exception; nested exception is java.io.FileNotFoundException: class path resource [mapper/] cannot be resolved to URL because it does not exist
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) ~[spring-context-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.4.RELEASE.jar:1.5.4.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693) [spring-boot-1.5.4.RELEASE.jar:1.5.4.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360) [spring-boot-1.5.4.RELEASE.jar:1.5.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) [spring-boot-1.5.4.RELEASE.jar:1.5.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) [spring-boot-1.5.4.RELEASE.jar:1.5.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) [spring-boot-1.5.4.RELEASE.jar:1.5.4.RELEASE]
at com.company.project.Application.main(Application.java:9) [classes/:na]
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactoryBean' threw exception; nested exception is java.io.FileNotFoundException: class path resource [mapper/] cannot be resolved to URL because it does not exist
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
... 18 common frames omitted

Controller 中制造个异常 如何让service中的操作 也能回滚

@RestController
@RequestMapping("/person")
public class PersonController {
@resource
private PersonService personService;

@PostMapping("/add")
public Result add(Person person) {
    personService.save(person);
    System.out.println(1/0);
    return ResultGenerator.genSuccessResult();
}

}

public interface PersonService extends Service {

}

@service
@transactional
public class PersonServiceImpl extends AbstractService implements PersonService {

}

小建议

spring boot这种简洁代码和lombok更配哦!

利用PostMan发送Post请求时Controller接收不到请求内容?

    @PostMapping("/detail")
    public Result detail( @RequestBody User user)
    {
        System.out.println(JSONObject.toJSONString(user));
        Integer id = user.getId();
        User user1 = userService.findById(id);
        return ResultGenerator.genSuccessResult(user1);
    }

Controller写法如上
{
"user":{
"id":12
}
}
PostMan请求如上

Controller这边接收到的user输出为{},空对象
请问这种接收json格式的,应该怎么写呢

反馈一下dome-user.sql

在mysql 5.6
执行sql会报错
错误代码: 1294
Invalid ON UPDATE clause for 'register_date' column


register_date datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
替换为
register_date DATETIME NOT NULL,
即可

Could not autowire. There is more than one bean of 'DataSource' type.

在Mybatis & Mapper & PageHelper 配置类 MybatisConfigurer 里面,29行有一个报错:
qq 20170721115808

Could not autowire. There is more than one bean of 'DataSource' type.
Beans:
dataSource   (DataSourceConfiguration.class) dataSource   (DataSourceConfiguration.class)
less... (Ctrl+F1)
Checks autowiring problems in a bean class.

环境
Intellij Ide 2017.2
jdk1.8

改变CodeGenerator.java的路径

我把CodeGenerator.java 放到 src/main/java 里面之后,就不能执行了,放在src/test/java 下面就可以,这是为什么呢?

状态码推荐使用spring的HttpStatus

项目本身就是Web项目,已经包含了org.springframework.http.HttpStatus类,可以直接使用,而且状态非常全。没必要重新定义吧。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.