1.java小菜鸟问个关于@requestbody注解的解源问题(不加问号不让
2.org.springframework.web.bind.MissingServletRequestParameterException
3.@PathVariable和@Re的区别
4.@PathVariableå@RequestParamçåºå«
5.Spring cloud: OpenFeign代替httpClient远程调用服务
java小菜鸟问个关于@requestbody注解的问题(不加问号不让
Ajax传递参数方式有多种,包括HTTP查询字符串、解源路径参数和消息体。解源
在HTTP查询字符串方式中,解源前端通过URL传递参数,解源后端使用@RequestParam注解接收,解源wpf 按钮 源码这种方式适用于GET请求。解源
路径参数方式,解源前端通过URL路径传递参数,解源后端使用@PathVariable注解接收,解源支持所有HTTP方法,解源且能接收复杂路径参数。解源伯乐源码发卡
消息体方式用于不支持GET的解源请求,参数通过Ajax消息体提交,解源后端使用@RequestBody注解解析。解源SpringMVC默认注册了多种消息体解析器,如StringHttpMessageConverter和MappingJackson2HttpMessageConverter。
消息体解析器会根据请求头的Content-Type属性自动选择解析器。使用原始Ajax发送消息体时,需要确保Content-Type设置正确。若使用jQuery,需相应设置RequestHeader;若使用Axios,其默认Content-Type为application/json,源码支付对接符合Restful规范。
后端接收到消息体后,若Content-Type为application/json,将使用JSON解析器处理;若Content-Type为"text/plain",则直接作为String接收。
此外,表单文件上传也属于消息体提交方式,需要设置enctype=multipart/formData,其原理与消息体方式相同,将参数以特定格式放入请求消息体中提交至后台。
org.springframework.web.bind.MissingServletRequestParameterException
ä»æ¥ä»½é¸¡æ±¤ï¼ç¬è¿äºå¿ é¡»çè¦ï¼æè½è¿ä¸å欢ççæ´»ï¼å¨ä¸åå好ä¹åï¼æ们æ»è¦ç»åä¸äºä¸å¼å¿çæ¥åï¼è¿æ®µæ¥åä¹è®¸å¾é¿ï¼ä¹è®¸åªæ¯ä¸è§éæ¥ï¼æ以èå¿ç¹ï¼ç»å¥½è¿ä¸ç¹æ¶é´ãå¼å¸¸è¯¦ç»ä¿¡æ¯ï¼
org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'book' for method parameter type Book is 手写源码分析not present
å¼å¸¸å¤ç°demoï¼
è¿è¡ç»æå±ç¤ºï¼
对äºè¿ç§å®ä½ç»æçå¯ä»¥ä½¿ç¨@RequestBodyæ¥æ¥æ¶
è¿è¡ç»æå±ç¤ºï¼
对äº@RequestParam注解çå ·ä½ç¨æ³
è¿è¡ç»æå±ç¤ºï¼
@RequestParam注解æ 注çåæ°ï¼å¦æåæ°ä¸æ¯å¿ å¡«åæ°ï¼å¯ä»¥è®¾ç½®required = falseã
å¦å¤åæè¿°ä¸ä¸ªå¼å¸¸ä¿¡æ¯ï¼
Resolved [org.springframework.web.bind.MissingRequestCookieException: Required cookie 'myCookie' for method parameter type String is not present]
å ¶å®è¿ä¸ªåçï¼æ¯å 为Cookieä¿¡æ¯æ²¡æä¼ å¯¼è´ç
å¼å¸¸å¤ç°demoï¼
è¿è¡ç»æå±ç¤ºï¼
解å³ä¹å¾ææ¾äºï¼å¢å ç¸åºcookieåæ°å°±å¯ä»¥äºï¼
Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'myHeader' for method parameter type String is not present]
ä¸é¢è¿ä¸ªå¼å¸¸å°±æ¯æ²¡æä¼ header导è´çäºï¼ä¸å ·ä½æ¼ç¤ºäºã
@PathVariable和@Re的区别
在Web开发中,@PathVariable和@Request相关注解如@PathVariable、@RequestHeader、@CookieValue和@RequestParam,各自承担着不同的职责。让我们一一解析它们的作用。
首先,@PathVariable在@RequestMapping的URI模板中起关键作用。当你使用"{ paramId}"格式的URL时,如"/owners/{ ownerId}", @PathVariable会将URL中的动态参数映射到方法参数上。例如,`@Controller`类中的传承家谱源码`findPet`方法,`@PathVariable("ownerId")`和`@PathVariable("petId")`将URL中的ownerId和petId值绑定到方法参数。如果参数名与URI模板不一致,可以在注解中指定模板中的名称。
其次,@RequestHeader、@CookieValue用于处理HTTP请求头和cookie中的值。@RequestHeader用于获取请求header部分的值,如示例中展示的Accept-Encoding和Keep-Alive,它们被分别绑定到方法参数encoding和keepAlive上。@CookieValue则用于绑定Request header中的cookie值,如JSESSIONID。
接着,@RequestParam主要处理表单提交中的数据。它适用于简单类型参数,通过Request.getParameter()获取,可以处理GET和POST请求的queryString或body数据。该注解的"value"属性指定参数名称,"required"属性指示是否必须有值。当Content-Type为application/x-www-form-urlencoded时,它尤其有效。
然而,@RequestBody则处理Content-Type非application/x-www-form-urlencoded的内容,如JSON或XML格式的数据。它通过HandlerAdapter的HttpMessageConverters解析post数据,将结果绑定到对象上,而不仅仅是简单的字符串或单个参数。
总结,@PathVariable用于URL模板中的参数绑定,@RequestHeader和@CookieValue关注HTTP头和cookie,而@RequestParam和@RequestBody则关注表单数据和非表单内容的处理。根据具体需求,选择合适的注解进行参数绑定和数据处理。
@PathVariableå@RequestParamçåºå«
1ã @PathVariable
å½ä½¿ç¨@RequestMapping URI template æ ·å¼æ å°æ¶ï¼ å³ someUrl/{ paramId}, è¿æ¶çparamIdå¯éè¿ @Pathvariable注解ç»å®å®ä¼ è¿æ¥çå¼å°æ¹æ³çåæ°ä¸ã
示ä¾ä»£ç ï¼
@Controller
@RequestMapping("/owners/{ ownerId}")
public class RelativePathUriTemplateController {
@RequestMapping("/pets/{ petId}")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
}
ä¸é¢ä»£ç æURI template ä¸åé ownerIdçå¼åpetIdçå¼ï¼ç»å®å°æ¹æ³çåæ°ä¸ãè¥æ¹æ³åæ°å称åéè¦ç»å®çuri templateä¸åéå称ä¸ä¸è´ï¼éè¦å¨@PathVariable("name")æå®uri templateä¸çå称ã
2ã @RequestHeaderã@CookieValue
@RequestHeader 注解ï¼å¯ä»¥æRequest请æ±headeré¨åçå¼ç»å®å°æ¹æ³çåæ°ä¸ã
示ä¾ä»£ç ï¼
è¿æ¯ä¸ä¸ªRequest çheaderé¨åï¼
Host localhost:
Accept text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Language fr,en-gb;q=0.7,en;q=0.3
Accept-Encoding gzip,deflate
Accept-Charset ISO--1,utf-8;q=0.7,*;q=0.7
Keep-Alive
@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
@RequestHeader("Keep-Alive") long keepAlive) {
}
ä¸é¢ç代ç ï¼ærequest headeré¨åç Accept-Encodingçå¼ï¼ç»å®å°åæ°encodingä¸äºï¼ Keep-Alive headerçå¼ç»å®å°åæ°keepAliveä¸ã
@CookieValue å¯ä»¥æRequest headerä¸å ³äºcookieçå¼ç»å®å°æ¹æ³çåæ°ä¸ã
ä¾å¦æå¦ä¸Cookieå¼ï¼
JSESSIONID=A4ACCDACE0B2C9CACDD
åæ°ç»å®ç代ç ï¼
@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@CookieValue("JSESSIONID") String cookie) {
}
å³æJSESSIONIDçå¼ç»å®å°åæ°cookieä¸ã
3ã@RequestParam, @RequestBody
@RequestParam
Aï¼ å¸¸ç¨æ¥å¤çç®åç±»åçç»å®ï¼éè¿Request.getParameter() è·åçStringå¯ç´æ¥è½¬æ¢ä¸ºç®åç±»åçæ åµï¼ String--> ç®åç±»åç转æ¢æä½ç±ConversionServiceé ç½®ç转æ¢å¨æ¥å®æï¼ï¼å 为使ç¨request.getParameter()æ¹å¼è·ååæ°ï¼æ以å¯ä»¥å¤çget æ¹å¼ä¸queryStringçå¼ï¼ä¹å¯ä»¥å¤çpostæ¹å¼ä¸ body dataçå¼ï¼
Bï¼ç¨æ¥å¤çContent-Type: 为 application/x-www-form-urlencodedç¼ç çå 容ï¼æ交æ¹å¼GETãPOSTï¼
C) 该注解æ两个å±æ§ï¼ valueãrequiredï¼ valueç¨æ¥æå®è¦ä¼ å ¥å¼çidå称ï¼requiredç¨æ¥æ示åæ°æ¯å¦å¿ é¡»ç»å®ï¼
示ä¾ä»£ç ï¼
@Controller
@RequestMapping("/pets")
@SessionAttributes("pet")
public class EditPetForm {
@RequestMapping(method = RequestMethod.GET)
public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
}
@RequestBody
该注解常ç¨æ¥å¤çContent-Type: ä¸æ¯application/x-www-form-urlencodedç¼ç çå 容ï¼ä¾å¦application/json, application/xmlçï¼
å®æ¯éè¿ä½¿ç¨HandlerAdapter é ç½®çHttpMessageConvertersæ¥è§£æpost data bodyï¼ç¶åç»å®å°ç¸åºçbeanä¸çã
å 为é ç½®æFormHttpMessageConverterï¼æ以ä¹å¯ä»¥ç¨æ¥å¤ç application/x-www-form-urlencodedçå 容ï¼å¤çå®çç»ææ¾å¨ä¸ä¸ªMultiValueMap<String, String>éï¼è¿ç§æ åµå¨æäºç¹æ®éæ±ä¸ä½¿ç¨ï¼è¯¦æ æ¥çFormHttpMessageConverter api;
Spring cloud: OpenFeign代替httpClient远程调用服务
在Spring Cloud中,OpenFeign是一个强大的工具,用于替代传统的HttpClient进行远程服务调用。它支持灵活的请求头设置,如单个或多个header属性的添加。例如,`ItfService`接口定义了带有`@RequestHeader`注解的方法,可以动态传递header信息。`FeignRequestInterceptor`类则允许自定义请求头,统一添加`sign`字段。
日志配置也是OpenFeign的重要环节,通过`FeignConfig`中的`feignLoggerLevel`和`feignOptionTime`方法,可以设置详细的请求日志和连接超时时间。对于服务注册与发现,Spring Cloud与Nacos集成,只需添加相关starter并配置服务名称、地址、用户名、权重和分组等信息。
然而,在实际应用中,可能会遇到如"The bean 'stock-service.FeignClientSpecification' could not be registered"这样的问题,这是因为尝试注册的bean名已存在,且Spring Cloud默认禁止覆盖。解决这类冲突,可能需要检查是否存在重复的bean定义或者调整bean的命名策略。
总的来说,OpenFeign在Spring Cloud中提供了强大的远程服务调用能力,结合Nacos的微服务治理,使得服务间通信更加方便。但同时也需要注意配置和命名的规范性,以避免潜在的冲突。