后端接口常用的注解
不知不觉已经快入职一个星期了,从学校到公司的跨度也在慢慢适应,进了公司才发现,一方面自己学的技术太少了,另一方面就是没有开发经验。来到公司的第一天就拿到了一套源码,反反复复看了那么久,终于摸索七七八八了。因为我以前用注解比较少,所以这次就讲讲我后端接口类中看到的几个高频注解(接口测试工具postman):
@RequestMapping
@RestController
@ResponseBody
@Controller
@ResquestParam
@PathVariable
让我们一起看看这几个注解分别是什么吧。
一 、@RequestMapping
在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置的映射作用一致。通俗来讲,就是postman的访问路径的入口就是@RequestMapping来决定的。
(转载于:https://blog.csdn.net/renanrenan/article/details/84654362)
1 <servlet> 2 <servlet-name>servletName</servlet-name> 3 <servlet-class>ServletClass</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>servletName</servlet-name> 7 <url-pattern>url</url-pattern> 8 </servlet-mapping>
RequestMapping注解有六个属性,下面我们把她分成三类进行说明(转载于:https://www.cnblogs.com/holly8/p/11425080.html)。
1、 value, method;
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、 consumes,produces;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、 params,headers;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
接下来看看这我项目中它是怎么用的吧
package com.esoft.api.modules.app; import com.esoft.api.modules.app.vo.ApiAppMessageVo; import com.esoft.api.web.ApiSupportController; import com.esoft.common.constant.BusinessConstant; import com.esoft.common.enums.AppMessageStatusEnum; import com.esoft.modules.app.domain.AppMessage; import com.esoft.modules.app.service.IAppMessageService; import com.ruoyi.common.core.domain.ApiResponse; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * 平台消息 * * @author ZhengChongHu * @date 2020/8/27 */ @RestController @RequestMapping("/api/app/message") public class ApiAppMessageController extends ApiSupportController { @Autowired private IAppMessageService appMessageService; @GetMapping("") public ApiResponse list(AppMessage appMessage, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size) { appMessage.setStatus(AppMessageStatusEnum.SHOW.getCode()); startPage(page, size, BusinessConstant.DEFAULT_ORDER_BY_COLUMN, "asc"); List<AppMessage> appMessages = appMessageService.selectAppMessageList(appMessage); return render(appMessages, convertToApiMessageVo(appMessages)); } /** * 转换为VO */ public List<ApiAppMessageVo> convertToApiMessageVo(List<AppMessage> appMessages) { if (CollectionUtils.isEmpty(appMessages)) { return Collections.EMPTY_LIST; } List<ApiAppMessageVo> voList = new ArrayList<>(); for (AppMessage appMessage : appMessages) { ApiAppMessageVo apiAppMessageVo = new ApiAppMessageVo(); BeanUtils.copyProperties(appMessage, apiAppMessageVo); voList.add(apiAppMessageVo); } return voList; } }
二、@RestController
三、@ResponseBody
四、@Controller
为什么要把这三个注解放在一起讲呢?因为
@RestController注解相当于@ResponseBody + @Controller合在一起的作用
(转载自:https://www.cnblogs.com/clwydjgs/p/9255046.html)
如果我们在类上用@RestController:类中的所有方法都支持json数据返回到postman,方法上就不用加@ResponseBody,相反,如果我们在类上加了@Controller:默认类中所有方法都不支持json数据返回,那我们在方法上就要加@ResponseBody,如果不加,那么返回给postman的内容就无法显示,正是这样,我们可以根据我们的需求去选择要使用@RestController还是@Controller+@ResponseBody,如果我们不希望类中所有方法都返回json数据给postman,比如方法1返回的是json数据,方法2返回的是其他类型数据(json除外),方法3返回的数据不希望别接收到。那就选用@Controller+@ResponseBody,在类上加@Controller,在方法1上加@ResponseBody就可以了。
1 package com.esoft.api.modules.app; 2 3 import com.esoft.api.modules.app.vo.ApiAppUserVo; 4 import com.esoft.api.web.ApiSupportController; 5 import com.esoft.modules.user.domain.AppUser; 6 import com.esoft.modules.user.service.IAppUserService; 7 import com.ruoyi.common.core.domain.ApiResponse; 8 import com.ruoyi.common.exception.api.ApiException404; 9 import org.springframework.beans.BeanUtils; 10 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.web.bind.annotation.*; 12 13 import javax.servlet.http.HttpServletRequest; 14 15 /** 16 * App用户 17 * 18 * @author ZhangChonghu 19 * @date 2020/8/19 20 * 希望说有方法都返回json数据到postman,用@RestController 21 */ 22 @RestController 23 @RequestMapping("/api/user/info") 24 public class ApiAppUserController extends ApiSupportController { 25 26 @Autowired 27 private IAppUserService appUserService; 28 29 30 /** 31 * App用户信息 32 */ 33 @GetMapping("/own") 34 public ApiResponse own(HttpServletRequest request) { 35 36 String mobile = getLoginName(request); 37 AppUser appUser = appUserService.selectAppUserByMobile(mobile); 38 if (appUser == null) { 39 throw new ApiException404(); 40 } 41 42 return ApiResponse.success(convertToApiAppUserVo(appUser)); 43 } 44 45 46 /** 47 * 编辑App用户信息 48 */ 49 @RequestMapping(value = "/own", method = {RequestMethod.PUT, RequestMethod.PATCH}) 50 public ApiResponse own(ApiAppUserVo apiAppUserVo, HttpServletRequest request) { 51 52 String mobile = getLoginName(request); 53 AppUser appUser = appUserService.selectAppUserByMobile(mobile); 54 BeanUtils.copyProperties(apiAppUserVo, appUser); 55 appUser.setMobile(mobile); 56 int result = appUserService.updateAppUser(appUser); 57 if (result > 0) { 58 return ApiResponse.success("操作成功", convertToApiAppUserVo(appUser)); 59 } 60 61 return ApiResponse.error("操作失败"); 62 } 63 64 /** 65 * App用户信息 66 */ 67 @GetMapping("/{id}") 68 public ApiResponse detail(@PathVariable(name = "id") String id) { 69 70 AppUser appUser = appUserService.selectAppUserById(id); 71 if (appUser == null) { 72 throw new ApiException404(); 73 } 74 return ApiResponse.success(convertToApiAppUserVo(appUser)); 75 } 76 77 78 /** 79 * 编辑App用户信息/ 80 */ 81 @RequestMapping(value = "/{id}", method = {RequestMethod.PUT, RequestMethod.PATCH}) 82 public ApiResponse edit(@PathVariable(name = "id") String id, ApiAppUserVo apiAppUserVo) { 83 84 AppUser appUser = appUserService.selectAppUserById(id); 85 BeanUtils.copyProperties(apiAppUserVo, appUser); 86 int result = appUserService.updateAppUser(appUser); 87 if (result > 0) { 88 return ApiResponse.success("操作成功", convertToApiAppUserVo(appUser)); 89 } 90 91 return ApiResponse.error("操作失败"); 92 } 93 94 95 /** 96 * 转换为VO类 97 */ 98 public ApiAppUserVo convertToApiAppUserVo(AppUser appUser) { 99 if (appUser == null) { 100 return null; 101 } 102 ApiAppUserVo apiAppUserVo = new ApiAppUserVo(); 103 BeanUtils.copyProperties(appUser, apiAppUserVo); 104 return apiAppUserVo; 105 } 106 107 108 }
注意看区别
1 package com.esoft.api.modules.app; 2 3 import com.esoft.api.modules.app.vo.ApiAppUserVo; 4 import com.esoft.api.web.ApiSupportController; 5 import com.esoft.modules.user.domain.AppUser; 6 import com.esoft.modules.user.service.IAppUserService; 7 import com.ruoyi.common.core.domain.ApiResponse; 8 import com.ruoyi.common.exception.api.ApiException404; 9 import org.springframework.beans.BeanUtils; 10 import org.springframework.beans.factory.annotation.Autowired; 11 import org.springframework.stereotype.Controller; 12 import org.springframework.web.bind.annotation.*; 13 14 import javax.servlet.http.HttpServletRequest; 15 16 /** 17 * App用户 18 * 19 * @author ZhangChonghu 20 * 希望所有方法都返回json数据,使用@Controller+@ResponseBody 21 * 如果不希望方法返回json数据到前端,在方法上去掉@ResponseBody 22 * 切记别把@Controller去掉了 23 * @date 2020/8/19 24 */ 25 @Controller 26 @RequestMapping("/api/user/info") 27 public class ApiAppUserController extends ApiSupportController { 28 29 @Autowired 30 private IAppUserService appUserService; 31 32 33 /** 34 * App用户信息 35 */ 36 @ResponseBody 37 @GetMapping("/own") 38 public ApiResponse own(HttpServletRequest request) { 39 40 String mobile = getLoginName(request); 41 AppUser appUser = appUserService.selectAppUserByMobile(mobile); 42 if (appUser == null) { 43 throw new ApiException404(); 44 } 45 46 return ApiResponse.success(convertToApiAppUserVo(appUser)); 47 } 48 49 50 /** 51 * 编辑App用户信息 52 */ 53 @ResponseBody 54 @RequestMapping(value = "/own", method = {RequestMethod.PUT, RequestMethod.PATCH}) 55 public ApiResponse own(ApiAppUserVo apiAppUserVo, HttpServletRequest request) { 56 57 String mobile = getLoginName(request); 58 AppUser appUser = appUserService.selectAppUserByMobile(mobile); 59 BeanUtils.copyProperties(apiAppUserVo, appUser); 60 appUser.setMobile(mobile); 61 int result = appUserService.updateAppUser(appUser); 62 if (result > 0) { 63 return ApiResponse.success("操作成功", convertToApiAppUserVo(appUser)); 64 } 65 66 return ApiResponse.error("操作失败"); 67 } 68 69 /** 70 * App用户信息 71 */ 72 @ResponseBody 73 @GetMapping("/{id}") 74 public ApiResponse detail(@PathVariable(name = "id") String id) { 75 76 AppUser appUser = appUserService.selectAppUserById(id); 77 if (appUser == null) { 78 throw new ApiException404(); 79 } 80 return ApiResponse.success(convertToApiAppUserVo(appUser)); 81 } 82 83 84 /** 85 * 编辑App用户信息/ 86 */ 87 @ResponseBody 88 @RequestMapping(value = "/{id}", method = {RequestMethod.PUT, RequestMethod.PATCH}) 89 public ApiResponse edit(@PathVariable(name = "id") String id, ApiAppUserVo apiAppUserVo) { 90 91 AppUser appUser = appUserService.selectAppUserById(id); 92 BeanUtils.copyProperties(apiAppUserVo, appUser); 93 int result = appUserService.updateAppUser(appUser); 94 if (result > 0) { 95 return ApiResponse.success("操作成功", convertToApiAppUserVo(appUser)); 96 } 97 98 return ApiResponse.error("操作失败"); 99 } 100 101 102 /** 103 * 转换为VO类 104 */ 105 public ApiAppUserVo convertToApiAppUserVo(AppUser appUser) { 106 if (appUser == null) { 107 return null; 108 } 109 ApiAppUserVo apiAppUserVo = new ApiAppUserVo(); 110 BeanUtils.copyProperties(appUser, apiAppUserVo); 111 return apiAppUserVo; 112 } 113 114 115 }
五、@ResquestParam
六、@PathVariable
这两个注解新手很容易搞混,我教大家一个方法能完美区分二者
ResquestParam(拆分为:resquest+Param ,翻译过来就是请求+参数)请求的参数就是url携带的参数(可以是get,可以是post);该注解有三个属性:
-value:请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。比如上图中第一个参数如果不设置value="page",则前端传入的参数名必须为pageNum,否则在后台接口中pageNum将接收不到对应的数据
-required:该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。
-defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。如果设置了此变量required不论是设置为true还是false其结果都是false,注意默认值可以使用SpEL表达式,如"#{systemProperties['java.vm.version']}"
如下:postman请求要携带参数page,size,如果不携带page默认是1,size默认是20
1 package com.esoft.api.modules.platform; 2 3 import com.esoft.api.modules.platform.vo.ApiPlatformInsuranceVo; 4 import com.esoft.api.web.ApiSupportController; 5 import com.esoft.modules.platform.domain.PlatformInsurance; 6 import com.esoft.modules.platform.service.IPlatformInsuranceService; 7 import com.ruoyi.common.core.domain.ApiResponse; 8 import org.springframework.beans.BeanUtils; 9 import org.springframework.beans.factory.annotation.Autowired; 10 import org.springframework.util.CollectionUtils; 11 import org.springframework.web.bind.annotation.GetMapping; 12 import org.springframework.web.bind.annotation.RequestMapping; 13 import org.springframework.web.bind.annotation.RequestParam; 14 import org.springframework.web.bind.annotation.RestController; 15 16 import java.util.ArrayList; 17 import java.util.Collections; 18 import java.util.List; 19 20 /** 21 * 保险公司平台列表 22 * 23 * @author ZhangChongHu 24 * @date 2020/8/18 25 */ 26 @RestController 27 @RequestMapping("/api/platform/insurance") 28 public class ApiPlatformInsuranceController extends ApiSupportController { 29 30 @Autowired 31 private IPlatformInsuranceService platformInsuranceService; 32 33 34 /** 35 * 保险平台列表 36 */ 37 @GetMapping("") 38 public ApiResponse list(PlatformInsurance platformInsurance, 39 @RequestParam(defaultValue = "1") int page, 40 @RequestParam(defaultValue = "20") int size) { 41 42 startPage(page, size, "sort_seq", "asc"); 43 List<PlatformInsurance> list = platformInsuranceService.selectPlatformInsuranceList(platformInsurance); 44 45 return render(list, convertToApiPlatformInsuranceVo(list)); 46 } 47 48 49 /** 50 * 转换为VO实例 51 * @param list 52 * @return 53 */ 54 public List<ApiPlatformInsuranceVo> convertToApiPlatformInsuranceVo(List<PlatformInsurance> list) { 55 if (CollectionUtils.isEmpty(list)) { 56 return Collections.emptyList(); 57 } else { 58 List<ApiPlatformInsuranceVo> voList = new ArrayList<>(); 59 for (PlatformInsurance insurance : list) { 60 ApiPlatformInsuranceVo insuranceVo = new ApiPlatformInsuranceVo(); 61 BeanUtils.copyProperties(insurance, insuranceVo); 62 voList.add(insuranceVo); 63 } 64 return voList; 65 } 66 } 67 68 69 }
@PathVariable(拆分为:Path+Variable,翻译过来就是路径+可变的)接收请求路径中占位符的值,并把值赋值给方法中的参数
如下:
(转载自:https://blog.csdn.net/sswqzx/article/details/84194979)
package com.day01springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; /** * @ Author * @ Date */ @Controller @RequestMapping("hello") public class HelloController2 { /** *3、占位符映射 * 语法:@RequestMapping(value=”user/{userId}/{userName}”) * 请求路径:http://localhost:8080/hello/show5/1/james * @param ids * @param names * @return */ @RequestMapping("show5/{id}/{name}") public ModelAndView test5(@PathVariable("id") Long ids ,@PathVariable("name") String names){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","占位符映射:id:"+ids+";name:"+names); mv.setViewName("hello2"); return mv; } }
@PathVariable("参数名")里面的参数要和@RequestMapping("show5/参数名")一致,就是@RequestMapping中没有参数a,@PathVariable("a")就是错误的
如果如果@RequestMapping()中有多个参数,就可以用多个@PathVariable接收
@PathVariable("id") Long ids 后面的这个ids为任意命名,也可以和@PathVariable里面的参数名一致。