(二)spring-mvc-showcase 和 swagger-springmvc 的恩恩怨怨

1. 搜索 spring showcase

就可以找到这篇 http://spring.io/blog/2010/07/22/spring-mvc-3-showcase

就是教你如何使用spring mvc

2. 去github 下载源码

3. 接下来的任务就是将swagger 整合进去

--------------------------------------------------------------------------

1. 进入 https://github.com/springfox/springfox/blob/v1.0.2/README.md 跟着一步一步做

2.  加入 依赖

<dependency>
    <groupId>com.mangofactory</groupId>
    <artifactId>swagger-springmvc</artifactId>
    <version>1.0.1</version>
</dependency>

读到这里发现还少包,意思是swagger-springmvc 在 0.9.5 版的时候移除了 scala 的全部依赖,还需要Spring 3.2.X 或以上,需要jackson 2.4.4或以上,需要guava 15.0 或以上 。

Notable Dependencies

As of v0.9.5 all dependencies on scala have been removed.
Spring 3.2.x or above
jackson 2.4.4
guava 15.0

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.4</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>15.0</version>
        </dependency>

随后发现缺少spring web 包 ,然后引入

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>

至此引入全部所需包。

3. 随后按照配置运行过程中,发现一个问题

六月 03, 2016 6:41:05 下午 org.apache.catalina.core.StandardContext loadOnStartup
严重: Servlet /spring-mvc-showcase threw load() exception
java.lang.IllegalArgumentException: Conflicting setter definitions for property "content": org.jdom2.Element#setContent(1 params) vs org.jdom2.Element#setContent(1 params)
	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getSetter(POJOPropertyBuilder.java:293)
	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getMutator(POJOPropertyBuilder.java:376)
	at com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder.getPrimaryMember(POJOPropertyBuilder.java:398)
	at com.mangofactory.swagger.models.property.field.FieldModelPropertyProvider.propertiesForDeserialization(FieldModelPropertyProvider.java:85)
	at com.mangofactory.swagger.models.property.provider.DefaultModelPropertiesProvider.propertiesForDeserialization(DefaultModelPropertiesProvider.java:43)
	at com.mangofactory.swagger.models.ModelDependencyProvider.propertiesFor(ModelDependencyProvider.java:121)
	at com.mangofactory.swagger.models.ModelDependencyProvider.resolvedPropertiesAndFields(ModelDependencyProvider.java:94)
	at com.mangofactory.swagger.models.ModelDependencyProvider.resolvedDependencies(ModelDependencyProvider.java:75)
	at com.mangofactory.swagger.models.ModelDependencyProvider.resolvedPropertiesAndFields(ModelDependencyProvider.java:108)
	at com.mangofactory.swagger.models.ModelDependencyProvider.resolvedDependencies(ModelDependencyProvider.java:75)
	at com.mangofactory.swagger.models.ModelDependencyProvider.dependentModels(ModelDependencyProvider.java:37)
	at com.mangofactory.swagger.models.DefaultModelProvider.dependencies(DefaultModelProvider.java:82)
	at com.mangofactory.swagger.readers.ApiModelReader.populateDependencies(ApiModelReader.java:215)
	at com.mangofactory.swagger.readers.ApiModelReader.readParametersApiModel(ApiModelReader.java:205)
	at com.mangofactory.swagger.readers.ApiModelReader.execute(ApiModelReader.java:82)
	at com.mangofactory.swagger.readers.ApiModelReader.execute(ApiModelReader.java:39)
	at com.mangofactory.swagger.core.CommandExecutor.execute(CommandExecutor.java:13)
	at com.mangofactory.swagger.scanners.ApiListingScanner.scan(ApiListingScanner.java:100)
	at com.mangofactory.swagger.core.SwaggerApiResourceListing.initialize(SwaggerApiResourceListing.java:72)
	at com.mangofactory.swagger.plugin.SwaggerSpringMvcPlugin.initialize(SwaggerSpringMvcPlugin.java:427)
	at com.mangofactory.swagger.plugin.SwaggerPluginAdapter.onApplicationEvent(SwaggerPluginAdapter.java:51)
	at com.mangofactory.swagger.plugin.SwaggerPluginAdapter.onApplicationEvent(SwaggerPluginAdapter.java:21)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:380)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:334)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:851)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:540)
	at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667)
	at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633)
	at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681)
	at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552)
	at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493)
	at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
	at javax.servlet.GenericServlet.init(GenericServlet.java:160)
	at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1266)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1185)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1080)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5027)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)

使用 mvn denpendency:tree 调查发现这个依赖

[INFO] +- com.rometools:rome:jar:1.5.0:compile
[INFO] |  +- com.rometools:rome-utils:jar:1.5.0:compile
[INFO] |  \- org.jdom:jdom:jar:2.0.2:compile

用到的地方是某个Controller ,然后把这个依赖删除,相关的 java 代码删除,就好了。

4. 最简单的api生成,不需要额外配置

<bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" />

jar源码访问

访问 /api-docs 这个path即可生成 swagger object

5. 使用继承了 默认配置 自定义配置

@Configuration
@EnableWebMvc
@EnableSwagger
@ComponentScan("com.myapp.controllers")
public class CustomJavaPluginConfig {

   private SpringSwaggerConfig springSwaggerConfig;

   @Autowired
   public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
      this.springSwaggerConfig = springSwaggerConfig;
   }

   @Bean //Don‘t forget the @Bean annotation
   public SwaggerSpringMvcPlugin customImplementation(){
      return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
            .apiInfo(apiInfo())
            .includePatterns(".*pet.*");
   }

    private ApiInfo apiInfo() {
      ApiInfo apiInfo = new ApiInfo(
              "My Apps API Title",
              "My Apps API Description",
              "My Apps API terms of service",
              "My Apps API Contact Email",
              "My Apps API Licence Type",
              "My Apps API License URL"
        );
      return apiInfo;
    }
}

需要注意的是ComponentScan 不能扫描 org.springframework 否则会报错

Caused by: java.lang.IllegalArgumentException: @EnableAsync annotation metadata was not injected

一般情况下不会扫描这个,因为是在 showcase 的基础上增加了一些代码,就容易出这个问题。

可以直接把这个注解类干掉。

6. 可以把一些配置提出来

7. 把swagger ui 接入

项目代码:[email protected]:witaste/spring-mvc-showcase.git

时间: 2024-11-06 02:39:05

(二)spring-mvc-showcase 和 swagger-springmvc 的恩恩怨怨的相关文章

Spring MVC中使用Swagger生成API文档和完整项目示例Demo,swagger-server-api

本文作者:小雷FansUnion-一个有创业和投资经验的资深程序员-全球最大中文IT社区CSDN知名博主-排名第119 实际项目中非常需要写文档,提高Java服务端和Web前端以及移动端的对接效率. 听说Swagger这个工具,还不错,就网上找了些资料,自己实践了下. 一:Swagger介绍 Swagger是当前最好用的Restful API文档生成的开源项目,通过swagger-spring项目 实现了与SpingMVC框架的无缝集成功能,方便生成spring restful风格的接口文档,

Spring MVC学习笔记--认识SpringMVC

Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架.通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术.Velocity.Tiles.iText 和 POI.Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术.Spring MVC 分离了控制器.

(二)Spring MVC 搭建

一.导包 1.添加Spring的核心包 2.添加Spring MVC的核心包 二.在WEB-INFO/web.xml中配置前端控制器DispatcherServlet 1 <?xml version="1.0" encoding="utf-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.su

Spring MVC(二)--Spring MVC登陆实例

本文通过一个简单的登陆实例实现Spring MVC的流程,同时整合 MyBatis使用,流程是这样的: 1.访问一个URL进入登陆界面 2.输入正确的用户名和密码,成功则进入index页面,否则留在登陆页 一.配置web.xml 创建好WEB项目之后的第一步就是配置web.xml文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" xmlns=&

spring mvc 03——Hello,SpringMVC

HelloSpringMVC 1.配置版 新建一个Moudle , 添加web的支持! 确定导入了SpringMVC 的依赖! 配置web.xml , 注册DispatcherServlet <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3

Swagger+ springfox +Spring mvc

简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步.Swagger 让部署管理和使用功能强大的API从未如此简单.这一次我将从零开始搭建一个工程来演示如何在Spring mvc中整合Swagger生成Restful接口文档. 新建工程 我们新建一个Maven工程,并添加Web Facet,工程结构如下图所

(二)spring MVC配置

使用Maven添加依赖的jar包 第一个还没用上 刚开始没加spring-context,@Controller没法用 web.xml配置 1.       配置DispatcherServlet <servlet>        <description>Spring MVC Servlet</description>        <servlet-name>springMVC</servlet-name>        <servle

Spring MVC 简述:从MVC框架普遍关注的问题说起

任何一个完备的MVC框架都需要解决Web开发过程中的一些共性的问题,比如请求的收集与分发.数据前后台流转与转换,当前最流行的SpringMVC和Struts2也不例外.本文首先概述MVC模式的分层思想与MVC框架普遍关注的问题,并以此为契机结合SpringMVC的入门级案例简要地从原理.架构角度介绍了它对这些问题的处理,包括请求处理流程.消息转换机制和数据绑定机制等核心问题.最后,本文对目前最为流行的两个MVC框架SpringMVC 和 一. MVC 模式与框架 1.MVC 模式 Java We

Spring+Spring MVC+MyBatis实现SSM框架整合详细教程【转】

关于Spring+SpringMVC+Mybatis 整合,见还有不少初学者一头雾水,于是写篇教程,初学者按部就班的来一次,可能就会少走不少弯路了. 一:框架介绍(啰嗦两句,可自行度娘) 1.1:Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的

spring mvc + mybatis的实际应用

一.mybatis mybatis为我们封装了对数据库的操作,只需要我们编写sql,便能实现对数据库的访问: 同时也为我们封装了返回的数据类型,只需要在配置文件中指定好,mybatis会自动帮我们遍历数据并封装. mybatis封装数据时需要我们提供一个容器,也就是模型,其本质就是一个实体类.所以mybatis的使用是依赖模型的. 下面开始介绍mybatis使用方法: 1.创建模型(实体类) public class TestEntity { private int id; private St