为什么要写这篇贴?

  要写一个最简单的CRUD 符合 Restful Api    规范的  一个Controller, 想百度搜索一下 直接复制拷贝 简单修改一下 方法内代码。

  然而, 搜索结果让我无语到家。 没一个是正在符合 Restful Api 规范的实例。 最无语的是 你呀直接 JSP 页面了,还说什么  Restful Api 啊!!!

  为方便以后自己复制拷贝使用,我把自己刚写的贴出来。

  

Swagger2:
@Configuration
@EnableSwagger2
public class Swagger2
{
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.dj.edi.web"))
.paths(PathSelectors.any())
.build();
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("EID 用户 CRUD")
.description("EID 用户 CRUD")
.version("1.0")
.build();
} }
Application:
@SpringBootApplication
@Import(springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration.class)
public class ComEdiOrderUserApplication
{
public static void main(String[] args) {SpringApplication.run(ComEdiOrderUserApplication.class, args);} }
UserApiController:

@RestController
@RequestMapping("/v1/user")
public class UserApiController
{
private static final Logger LOGGER = LoggerFactory.getLogger(UserApiController.class); @Autowired
private ClientUsersRepository repository; @ApiOperation(value = "获取所有用户数据")
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ResponseEntity<List<ClientUsers>> getClientUsersList() {
try {
return ResponseEntity.ok(repository.findAll());
} catch (Exception e) {
LOGGER.info(" 获取所有用户数据异常 " + e.getMessage(), e);
return ResponseEntity.status(500).body(null);
}
} @ApiOperation(value = "获取用户数据")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<ClientUsers> getClientUsers(@PathVariable String id) {
try {
return ResponseEntity.ok(repository.findOne(id));
} catch (Exception e) {
LOGGER.info(" 获取用户数据 " + id + " 数据异常 " + e.getMessage(), e);
return ResponseEntity.status(500).body(null);
}
} @ApiOperation(value = "创建用户", notes = "根据User对象创建用户")
@ApiImplicitParam(name = "users", value = "用户详细实体user", required = true, dataType = "ClientUsers", paramType = "body")
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<ClientUsers> createUser(@Valid @RequestBody ClientUsers users) {
try { users.setId(ObjectId.get().toString());
return ResponseEntity.ok(repository.save(users)); } catch (Exception e) {
LOGGER.info(" 创建用户 " + users + " 数据异常 " + e.getMessage(), e);
return ResponseEntity.status(500).body(null);
}
} @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "ClientUsers", paramType = "body")
})
@RequestMapping(value = "{id}", method = RequestMethod.PUT)
public ResponseEntity<ClientUsers> updateUser(@PathVariable("id") String id,@Valid @RequestBody ClientUsers user) {
try {
user.setId(id);
return ResponseEntity.ok(repository.save(user));
} catch (Exception e) {
LOGGER.info(" 更新用户 " + user + " 数据异常 " + e.getMessage(), e);
return ResponseEntity.status(500).body(null);
}
} @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "String", paramType = "path")
@RequestMapping(value = "{id}", method = RequestMethod.DELETE)
public ResponseEntity<String> deleteUser(@PathVariable String id) {
try {
repository.delete(id);
return ResponseEntity.ok("ok");
} catch (Exception e) {
LOGGER.info(" 删除用户 " + id + " 数据异常 " + e.getMessage(), e);
return ResponseEntity.status(500).body(null);
}
}
}

ClientUsersRepository:
@Component
public interface ClientUsersRepository extends MongoRepository<ClientUsers, String>
{
ClientUsers findByips(String ip);
ClientUsers findByclientFlag(String clientFlag);
}
ClientUsers:
@Data
public class ClientUsers implements Serializable
{ @Id
private String id; /**
* 用户名称
*/
@NotBlank(message = "用户名称 不能为空")
@Pattern(regexp = "^(?!string)",message = "不能是 stirng")
private String userName; /**
* ip
*/
@NotNull(message = "ip 至少需要个")
private List<String> ips; /**
* 标识
*/
@NotBlank(message = " 标识 不能为空")
@Pattern(regexp = "^(?!string)",message = "不能是 stirng")
private String clientFlag; /**
* 客户服务ID
*/
@NotBlank(message = "客户服务ID 不能为空")
@Pattern(regexp = "^(?!string)",message = "不能是 stirng")
private String checkID;
}
有哪里不好的希望指正
 

Restful Api CRUD 标准示例 (Swagger2+validator)的更多相关文章

  1. 虚拟研讨会:如何设计好的RESTful API?

    http://www.infoq.com/cn/articles/how-to-design-a-good-restful-api/ REST架构风格最初由Roy T. Fielding(HTTP/1 ...

  2. 虚拟研讨会:如何设计好的RESTful API(转)

    原文:虚拟研讨会:如何设计好的RESTful API? REST架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出.HTTP就是该架构风 ...

  3. 如何设计好的RESTful API 之好的RESTful API 特征

    原文地址:http://blog.csdn.net/ywk253100/article/details/25654021 导读:设计好RESTful API对于软件架构的可扩展性.可伸缩性和消费者的体 ...

  4. 最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。

     #基于webpack构建的 Koa2 restful API 服务器脚手架    这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeSc ...

  5. 我所理解的RESTful Web API [Web标准篇]

    REST不是一个标准,而是一种软件应用架构风格.基于SOAP的Web服务采用RPC架构,如果说RPC是一种面向操作的架构风格,而REST则是一种面向资源的架构风格.REST是目前业界更为推崇的构建新一 ...

  6. SpringBoot使用Swagger2实现Restful API

    很多时候,我们需要创建一个接口项目用来数据调转,其中不包含任何业务逻辑,比如我们公司.这时我们就需要实现一个具有Restful API的接口项目. 本文介绍springboot使用swagger2实现 ...

  7. 整合swagger2生成Restful Api接口文档

    整合swagger2生成Restful Api接口文档 swagger Restful文档生成工具 2017-9-30 官方地址:https://swagger.io/docs/specificati ...

  8. Spring Boot中使用Swagger2生成RESTful API文档(转)

    效果如下图所示: 添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!-- https://mvnrepository.com/artifact/io.springfox ...

  9. Swagger2在DBA Service中生成RESTful API的实践

    目的与背景: 目的:对外暴露DBA Service必要的RESTful API,形成规整的API文档 背景:DBA Service后端采用Spring-boot,属于Spring家族,故生成API的工 ...

随机推荐

  1. 剑指Offer——字符流中第一个不重复的字符

    题目描述: 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读 ...

  2. node.js + mongodb 做项目的详解(二)

    这次内容是结合bootstrap把登陆注册做好,还有就是express的中间件等问题. 看这篇博客之前建议先看我上篇写的那篇博客http://www.cnblogs.com/hubwiz/p/4118 ...

  3. 借助 Django 的 smart_str 和 smart_unicode 进行编码转换(转)

    原文:http://www.dirk.sh/diary/using-django-smart_str-smart_unicode/ Django 为字符编码的转换提供了非常简洁的方法: 1.djang ...

  4. K-modes聚类算法MATLAB

    K-modes算法主要用于分类数据,如 国籍,性别等特征. 距离使用汉明距离,即有多少对应特征不同则距离为几. 中心点计算为,选择众数作为中心点. 主要功能: 随机初始化聚类中心,计算聚类. 选择每次 ...

  5. 001-linux scp文件拷贝

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  6. 004-Shell 基本运算符、算术运算符、关系运算符、布尔运算符、辑运算符、字符串运算符、文件测试运算符

    一.概述 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 二.算术运算符 原生bash不支持简单的数学运算,但是可以通过其他命 ...

  7. 【转载】ARM MMU详解

    一.MMU的产生       许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以 ...

  8. Code signing is required for product type 'Application' in SDK 'iOS 11.2'

    在打包的时候出现这样一个错误,Code signing is required for product type 'Application' in SDK 'iOS 11.2'  ,就是说代码签名证书 ...

  9. MFC中对基于ODBC对数据ACCESS数据库的增删改查。

    在MFC中可以使用很多方法对数据库进行操作. 什么ODBC  什么ADO之类的,这里要介绍使用的ODBC这种方法,通过本文的阅读可以达初步掌握在MFC里面通过ODBC访问ACCESS数据库. 涉及到的 ...

  10. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) D. Innokenty and a Football League

    地址:http://codeforces.com/contest/782/problem/D 题目: D. Innokenty and a Football League time limit per ...