V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  huifer  ›  全部回复第 2 页 / 共 6 页
回复总数  111
1  2  3  4  5  6  
2021-09-24 15:51:53 +08:00
回复了 MrGoooo 创建的主题 Java 基于 mybatis-plus 的联表查询工具,可以实现大部分的写 SQL 需求
sql 很难?要这么用不如 hibernate 吧
2021-08-26 10:10:32 +08:00
回复了 HannibaI 创建的主题 程序员 非常讨厌 DeadLine,有啥办法吗?
没有截止时间真是可笑
2021-06-25 09:56:39 +08:00
回复了 ranxx 创建的主题 程序员 内卷时代的筛选手段:面试考算法,你怎么看?
想要背能背不出?
2021-06-24 12:20:41 +08:00
回复了 dvsilch 创建的主题 问与答 请教一下各位 v 友关于非科班转行的发展方向
背书就完事了找个工作背,背完了进了公司在看看要干嘛吧
2021-06-23 13:11:01 +08:00
回复了 ylls 创建的主题 Java Java 系统改造求解
不靠谱
2021-06-15 17:30:02 +08:00
回复了 x940727 创建的主题 程序员 彦祖们,写 CRUD 的时候会使用设计模式吗?
2021-06-15 14:22:49 +08:00
回复了 tctc4869 创建的主题 程序员 有什么笔记软件,可以把笔记项目导出为 html 目录?
gitbook
2021-06-15 12:32:11 +08:00
回复了 rockyliang 创建的主题 程序员 后端接口如何做版本控制?
请求头
2021-06-15 12:31:13 +08:00
回复了 badribbit 创建的主题 问与答 Java 程序员工作一年好跳槽吗?
先学会“八股文”
2021-06-04 15:30:28 +08:00
回复了 richChou 创建的主题 程序员 又是看 API 文档崩溃的一天
你可以写一个优质的文档让我们看看吗
2021-06-04 10:14:48 +08:00
回复了 css3 创建的主题 Linux Linux 实时查看日志时,如何高亮显示一些常见关键字
perl -pe
2021-06-02 16:16:05 +08:00
回复了 MadDoggy 创建的主题 Java 关于 aop 记录日志的一个问题
可以尝试手动注入切面,通过 bean 方式
2021-06-02 16:14:48 +08:00
回复了 Er1c0 创建的主题 问与答 sourcetree 怎么在显示上 分隔 公司 与 非公司 的项目
点击新建文件夹
2021-06-01 17:20:26 +08:00
回复了 amrom 创建的主题 Java 关于微服务多模块问题
2021-05-26 13:15:15 +08:00
回复了 Aliberter 创建的主题 Java 求助! springboot 如何获取 url 上的参数,@PathVariable 复用问题
@Aliberter
解决方案为开启一个独立的 servlet,具体在 springboot 中注入方式如下:

```
@Component
@ComponentScan("com.example.demo.*")
public class Beans {
@Autowired
private ApplicationContext context;

@Bean
public ServletRegistrationBean viewRedisServlet() {
ServletRegistrationBean<Servlet> servletServletRegistrationBean = new ServletRegistrationBean<>();
CustomerServlet servlet = new CustomerServlet();
servlet.setContext(context);

servletServletRegistrationBean.setServlet(servlet);
return servletServletRegistrationBean;
}
}
```

第二步编写 servlet 具体代码如下:

```
@WebServlet
public class CustomerServlet extends HttpServlet {
Gson gson = new Gson();
private ApplicationContext context;

public ApplicationContext getContext() {
return context;
}

public void setContext(ApplicationContext context) {
this.context = context;
}

@SneakyThrows @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// 从请求头中获取一个标记,用于确认是需要进行处理的

String c = req.getHeader("is_c");
if (Boolean.valueOf(c)) {

String contextPath = req.getContextPath();
String servletPath = req.getServletPath();

// /{controller}/{action}/{apiVersion}/{userId}/{clientName}
String requestURI = req.getRequestURI();
String[] split = requestURI.split("/");

String controller = null;
String action = null;
String apiVersion = null;
String userId = null;
String clientName = null;
if (split.length == 6) {
controller = split[1];
action = split[2];
apiVersion = split[3];
userId = split[4];
clientName = split[5];
}

// 通过 spring 上下文去搜索 controller + actiron 对应的方法

ApplicationContext tuUse = this.context;
if (StringUtils.hasText(controller)) {
// 找到实例
Object bean = tuUse.getBean(controller);
// 找到执行方法
Method[] methods = bean.getClass().getDeclaredMethods();

Method toCall = null;
for (Method method : methods) {
boolean equals = method.getName().equals(action);
if (equals) {
toCall = method;
break;
}
}
// 获取方法参数类型, 你需要做转换
Class<?>[] types = toCall.getParameterTypes();

// 转换后进行参数使用调用方法
Object invoke = toCall.invoke(bean, apiVersion, userId, clientName);

resp.setContentType("application/json; charset=UTF-8");
resp.getWriter().write(gson.toJson(invoke));
}
System.out.println(contextPath);
}
}

}
```

上述代代码处理流程:

1. 判断是需要进行处理的
2. 将 url 中的 /{controller}/{action}/{apiVersion}/{userId}/{clientName}参数提取
3. 通过成员变量 context 在 spring 中根据名字获取 bean 实例,名字是 controller,通过 spring 中 Component 注解的 value 进行赋值
4. 在 bean 实例种搜索 action 对应的方法,这里要求方法名称和 action 强对应。
5. 将上一步得到的方法提取方法参数,将 url 参数进行类型转换。
6. 反射执行
7. response 返回





其他代码如下:

```
@Data
public class IndexResponse {
private int code;
private Object data;
}
```



```
@Service(value = "home")
public class HomePageController {

public IndexResponse index(
String apiVersion,
String userId,
String clientName) {

IndexResponse response = new IndexResponse();
response.setCode(1);
response.setData(apiVersion + "-" +
userId + "-" +
clientName);
return response;
}

}
```



测试用例如下:

GET http://localhost:8080/home/index/6.0.0/0/Any.

HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Content-Length: 32
Date: Wed, 26 May 2021 05:14:26 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
"code": 1,
"data": "6.0.0-0-Any."
}
2021-05-26 12:38:22 +08:00
回复了 Aliberter 创建的主题 Java 求助! springboot 如何获取 url 上的参数,@PathVariable 复用问题
自己写 url 解析写 aop,写拦截器你在自己做类型转换等你写完这个就相当于实现了 spring-mvc 中的路由解析只是没有注解.
不行,无法使用同一个本地仓库
2021-05-19 13:28:54 +08:00
回复了 asdasdasdzxc 创建的主题 程序员 项目的前期架构是否要反复的揣摩一套体系?
需要考虑人员配比,硬件成本、开发时间这些问题。这些问题一次性都来了你就不会想这些。

gitlab commit 强制规范。规范检查谁去做,出现问题如何处理。
git commit before 强制跑 soner 。此处需要额外硬件成本,是否一个项目使用一个 soner,soner 的规则制定谁参与。
测试一个功能一个服务的实例和所有基础服务。不知道想要表达什么。
强制所有模块拆分成为一个,一个 git 远程仓库。拆分模块更多的会拆分服务,按照服务分配多个仓库。
通过 ELK 采集日志集中分析和查看。elk 的硬件资源。
对新表上线必须模拟日增数据。日增的模拟用意是什么?
对服务的监控和熔断,限流。服务监控是基础,熔断限流在项目伊始就应该直接具备,允许额外自定义。
git push master 必须通过所有回归测试。
所有服务必须有基本的 readme.md 介绍。readme 不如产品文档+版本文档+接口文档。
所有的服务必须有版本发布管理。不错
所有的部署必须通过 git 钩子自动化部署的。部署应该手动,避免出现 commit 一次部署一次,会导致硬盘控件暴增
模块的更新必须共同开发的同学一起 code view 。review 的成本很高至少会拖动 2 个人进行时间消耗,review 的时间节点是什么?,能跑就可以。
模块的调用必须通过 feign 或者 MQ 来完成代码的解耦。大可不必
2021-05-13 13:05:55 +08:00
回复了 zhoudaiyu 创建的主题 程序员 大家能推荐一些技术公众号吗?
JustSourceCode
1  2  3  4  5  6  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2892 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 33ms · UTC 13:52 · PVG 21:52 · LAX 06:52 · JFK 09:52
Developed with CodeLauncher
♥ Do have faith in what you're doing.