gpt4 book ai didi

java - 自定义注释,用于从 HttpServletRequest 获取具有指定 @RequestHeaders 集的自定义对象

转载 作者:行者123 更新时间:2023-12-02 09:52:12 28 4
gpt4 key购买 nike

我正在寻找创建自定义注释以从 HttpServletRequest 读取 header 集的方法

假设我有以下代码:

@RestController
public class ExampleController {

@PostMapping(path = "/path")
public void method(@RequestHeader("session-session_id") long sessionId,
@RequestHeader("session-user_id") long userId,
@RequestHeader("session-user_name") String userName) {
UserInfo userInfo = UserInfo.of(sessionId, userId, userName);
//service.handle(userInfo);
}

public static final class UserInfo {
private final long sessionId;
private final long userId;
private final String userName;

private UserInfo(long sessionId, long userId, String userName) {
this.sessionId = sessionId;
this.userId = userId;
this.userName = userName;
}

public static UserInfo of(long sessionId, long userId, String userName) {
return new UserInfo(sessionId, userId, userName);
}
}
}

如您所见,我在请求 header 中有用户信息。所有用户信息 header 都将以“session-”前缀开头。在真实的系统上我将有超过 3 个字段。它们将用于处理很多请求。因此,我必须将具有完整用户信息的对象转移到服务级别。为每个请求创建这个 UserInfo ,例如 UserInfo.of(sessionId, userId, userName) 看起来多余而且相当丑陋。这就是问题所在。

我至少知道另外两种方法来解决这个问题:

@PostMapping(path = "/path")
public void method(HttpServletRequest request) {
UserInfo userInfo = UserInfo.of(request);
}

public static UserInfo of(HttpServletRequest request) {
//request.getHeader("header name");
}

@PostMapping(path = "/path")
public void method(@RequestHeader Map<String, String> request) {
UserInfo userInfo = UserInfo.of(request);
}

public static UserInfo of(Map<String, String> request) {
//map.get("header name");
}

但事实并非如此。我正在寻找像 spring 那样创建 UserInfo 的方法:

@PostMapping(path = "/path")
public void method(@UserInfo UserInfo request) {
UserInfo userInfo = UserInfo.of(request);
}

你能帮我解决一下吗?或者至少提供一个文档链接,其中描述了 @RequestHeader 如何在 spring 内实现

最佳答案

您需要定义自定义HandlerMethodArgumentResolver :

public class UserInfoResolver implements HandlerMethodArgumentResolver {

@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(UserInfo.class);
}

@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
// There are no null-checks here for simplicity,
// so don't forget to add them in production code
return UserInfo(
Long.parseLong(webRequest.getHeader("session-session_id")),
Long.parseLong(webRequest.getHeader("session-user_id")),
webRequest.getHeader("session-user_name")
);
}
}

然后让 Spring 了解您的 Web 配置类中的参数解析器:

@Configuration
public class WebApiConfiguration extends WebMvcConfigurationSupport {
...

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new UserInfoResolver());
}

...
}

最后你可以这样使用它:

@PostMapping(path = "/path")
public void method(UserInfo userInfo) {
//service.handle(userInfo);
}

关于java - 自定义注释,用于从 HttpServletRequest 获取具有指定 @RequestHeaders 集的自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56239886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com