当前位置: 首页 > news >正文

宁波汽车网站建设wordpress微信小程序

宁波汽车网站建设,wordpress微信小程序,wordpress的seo优化,北京网站开发公司一、前言 在Spring Boot项目开发过程中,对于接口API发布URL访问路径,一般都是在类上标识RestController或者Controller注解,然后在方法上标识RequestMapping相关注解,比如:PostMapping、GetMapping注解,通…

一、前言

在Spring Boot项目开发过程中,对于接口API发布URL访问路径,一般都是在类上标识@RestController或者@Controller注解,然后在方法上标识@RequestMapping相关注解,比如:@PostMapping@GetMapping注解,通过设置注解属性,发布URL。在某些场景下,我觉得这样发布URL太麻烦了,不适用,有没有什么其他方法自由发布定义的接口呢?答案是肯定的。

二、一般开发流程

按照上面的描述,我们先看一下一般常用的开发代码:

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;@RestController
public class TestController {@RequestMapping("/test/url")public String test(@RequestParam String name, @RequestBody Map<String, Object> map) { // 这里只是方便测试,实际情况下,请勿使用Map作为参数接收StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("hello, ").append(name).append(", receive param:");for (Map.Entry<String, Object> entry : map.entrySet()) {stringBuilder.append("\n").append("key: ").append(entry.getKey()).append("--> value: ").append(entry.getValue());}return stringBuilder.toString();}}

测试效果:

在这里插入图片描述

三、自定义URL发布逻辑

参考步骤二的测试截图效果,我们自定义发布一个URL。

1. 新建一个spring boot项目,导入相关依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

2. 修改Controller实现类代码

去掉@RestController@RequestMapping相关注解,示例代码如下:

import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Map;// @RestController
@Component
public class TestController {//@RequestMapping("/test/url")@ResponseBody  // 注意:此注解需要添加,不能少public String test(/*@RequestParam*/ String name,/* @RequestBody*/ Map<String, Object> map) { // 这里只是方便测试,实际情况下,请勿使用Map作为参数接收StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("hello, ").append(name).append(", receive param:");for (Map.Entry<String, Object> entry : map.entrySet()) {stringBuilder.append("\n").append("key: ").append(entry.getKey()).append("--> value: ").append(entry.getValue());}return stringBuilder.toString();}}

3. 自定义一个事件监听,实现URL发布功能

参考代码如下:

import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;/*** 注册一个web容器初始化以后的事件监听,注册自定义URL*/
@Component
public class CustomRegisterUrl implements ApplicationListener<WebServerInitializedEvent> {/*** 标识事件监听器是否已经注册,避免重复注册*/private volatile AtomicBoolean flag = new AtomicBoolean(false);/*** 需要发布的地址*/public static final String CUSTOM_URL = "/test/url";@Autowiredprivate RequestMappingHandlerMapping requestMappingHandlerMapping;@Autowiredprivate TestController testController;@SneakyThrows@Overridepublic void onApplicationEvent(WebServerInitializedEvent event) {if (flag.compareAndSet(false, true)) {// 构建请求映射对象RequestMappingInfo requestMappingInfo = RequestMappingInfo.paths(CUSTOM_URL) // 请求URL.methods(RequestMethod.POST, RequestMethod.GET) // 请求方法,可以指定多个.build();// 发布url,同时指定执行该请求url的具体类变量的的具体方法requestMappingHandlerMapping.registerMapping(requestMappingInfo, testController, testController.getClass().getMethod("test", String.class, Map.class));}}
}

4. 测试效果

同样请求:http://localhost:8080/test/url?name=jack

在这里插入图片描述

可以看到,此时请求效果并不是正常的,存在参数丢失,怎么办呢?

注意:如果请求出现如下错误:

java.lang.IllegalArgumentException: Expected lookupPath in request attribute "org.springframework.web.util.UrlPathHelper.PATH".

可以在application.yaml文件中添加如下内容:

spring:mvc:pathmatch:matching-strategy: ant_path_matcher

5. 增加统一请求处理器

为了实现参数可以正常解析,同时方便增加自定义处理逻辑,我们可以增加一个统一的请求处理器,参考示例:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;@Component
public class CustomHandlerUrl {public static final Method HANDLE_CUSTOM_URL_METHOD;private static final ObjectMapper OBJECTMAPPER = new ObjectMapper();@Autowiredprivate TestController testController;static {// 提前准备好参数对象Method tempMethod = null;try {tempMethod = CustomHandlerUrl.class.getMethod("handlerCustomUrl", HttpServletRequest.class, HttpServletResponse.class);} catch (NoSuchMethodException e) {e.printStackTrace();}HANDLE_CUSTOM_URL_METHOD = tempMethod;}@ResponseBody/***  拦截自定义请求的url,可以做成统一的处理器,这里我只做简单实现,专门处理test*/public Object handlerCustomUrl(HttpServletRequest request, HttpServletResponse response) throws IOException {// 获取参数 get方式请求参数String name = request.getParameter("name");// 获取 post方式请求参数Map<String, Object> map = OBJECTMAPPER.readValue(request.getInputStream(), Map.class);// 执行业务方法String result = testController.test(name, map);return result;}
}

6. 修改事件监听逻辑

修改事件监听逻辑,此时注册URL时,绑定统一处理器就行了。

示例代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.context.WebServerInitializedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;import java.util.concurrent.atomic.AtomicBoolean;/*** 注册一个web容器初始化以后的事件监听,注册自定义URL*/
@Component
public class CustomRegisterUrl implements ApplicationListener<WebServerInitializedEvent> {/*** 标识事件监听器是否已经注册,避免重复注册*/private volatile AtomicBoolean flag = new AtomicBoolean(false);/*** 需要发布的地址*/public static final String CUSTOM_URL = "/test/url";@Autowiredprivate RequestMappingHandlerMapping requestMappingHandlerMapping;@Autowiredprivate CustomHandlerUrl customHandlerUrl;@Overridepublic void onApplicationEvent(WebServerInitializedEvent event) {if (flag.compareAndSet(false, true)) {// 构建请求映射对象RequestMappingInfo requestMappingInfo = RequestMappingInfo.paths(CUSTOM_URL) // 请求URL.methods(RequestMethod.POST, RequestMethod.GET) // 请求方法,可以指定多个.build();// 发布url,指定一下url的处理器requestMappingHandlerMapping.registerMapping(requestMappingInfo, customHandlerUrl, CustomHandlerUrl.HANDLE_CUSTOM_URL_METHOD);}}
}

7. 重新测试

在这里插入图片描述

此时,请求可以发现,效果和使用@RestController+@RequestMapping注解就一样了。

四、写在最后

自定义发布URL路径一般情况下很少使用,不过针对特殊url的处理,以及自定义rpc框架发布url时,选择这样处理好了,可以达到出其不意的效果。

http://www.yayakq.cn/news/515508/

相关文章:

  • qq做我女朋友好吗网站seo权威入门教程
  • 全国住房城乡建设厅网站网站开发与服务合同范本
  • 怎么做一网站安徽网站建设详细策划
  • 网站域名切换播放量网站推广免费
  • 网站开发 接个支付支付难吗怎样开一个小贸易公司
  • 网站建设学生兼职广州公司注册流程及费用
  • 华亭县门户网站县文化馆网站建设方案
  • 凡科网站建设总结教学平台网站开发
  • 网站标题字体大小海南住房和城乡建设部网站
  • 网站建设攵金手指专业wordpress一键安装教程
  • 用什么自己做网站吗谷歌seo和sem
  • 郑州做网站的专业公司网络营销推广引流方式
  • 厦门唯一官方网站手机网站如何做
  • 襄阳营销型网站建设河北工程大学事件
  • 一站式进货平台网站建设菜鸟制作个人网站网页实例
  • 专门做文创产品的网站网站建设公司86215
  • 站长工具查询网站信息wordpress 主题 恢复
  • 案例展示在网站中的作用做邮轮上哪个网站订票好
  • 姑苏网站制作手机端网站建站流程
  • 学做网站视频论坛知识产权网站开发
  • 建立网站怎么做关键字专门建站的公司
  • 品牌注册怎么注册南宁seo专员
  • flash网站引导页面制作一站式服务包括哪些内容
  • 广州网站优化服务做网站平台应该注意哪些
  • 工信部网站域名备案信息查询汉中网站建设服务
  • 在网上怎么开店卖东西汕头百度seo在哪里
  • 四平做网站电商网站业务流程
  • 如何做网站水晶头网站建设合同属于技术合同吗
  • 天津 公司网站建设wordpress 集成环境
  • 优搜云seo北京搜索引擎优化seo