spring - 使用 Feign 处理传入的 httpServletRequest 时转换请求正文错误
问题描述
我的项目中有两个模块,我想在 web 模块中获取一个 httpServletRequest 并使用 feign 将其发送到核心模块,以便在核心模块中对此请求进行一些处理。
以下是分别的步骤:
网络模块控制器:
@RestController
@RequestMapping(value = ["/**"])
class WebController(val urlShortenerClient: UrlShortenerClient) {
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
@GetMapping(produces = [MediaType.APPLICATION_JSON_VALUE])
fun getRedirectionUrl(httpServletRequest: HttpServletRequest): String {
logger.info("received url: ${httpServletRequest.requestURL}")
//*** this log appears and then error appears
return urlShortenerClient.getRedirectionUrl(httpServletRequest)
}
}
网络模块假装:
@FeignClient(value = "url-shortener",
url = "http://localhost:8080")
interface UrlShortenerClient {
@RequestMapping(value = ["/url-shortener"], produces = [MediaType.APPLICATION_JSON_VALUE])
fun getRedirectionUrl(httpServletRequest: HttpServletRequest): String
}
核心模块控制器:
@RestController
@RequestMapping(value = ["/url-shortener"])
class UrlShortenerController(private val urlShortenerService: UrlShortenerService) {
private val logger: Logger = LoggerFactory.getLogger(this.javaClass)
@GetMapping(produces = [MediaType.APPLICATION_JSON_VALUE])
fun getRedirectionUrl(httpRequest: HttpServletRequest): String {
logger.info("received url in core controller: ${httpRequest.requestURL}")
return urlShortenerService.createUrlShortener(httpRequest)
}
}
但是当我通过邮递员发送获取请求时,我收到以下错误(实际上,当要在 Web 控制器中调用 feign 客户端方法时,会出现错误):
2020-10-12 14:04:41.921 ERROR 20484 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.codec.EncodeException: Error converting request body] with root cause
java.lang.StackOverflowError: null
at java.base/sun.net.util.IPAddressUtil.checkHostString(IPAddressUtil.java:460) ~[na:na]
at java.base/java.net.URLStreamHandler.setURL(URLStreamHandler.java:518) ~[na:na]
at java.base/java.net.URLStreamHandler.parseURL(URLStreamHandler.java:312) ~[na:na]
at java.base/sun.net.www.protocol.file.Handler.parseURL(Handler.java:67) ~[na:na]
at java.base/java.net.URL.<init>(URL.java:674) ~[na:na]
at java.base/java.net.URL.<init>(URL.java:541) ~[na:na]
at java.base/jdk.internal.loader.URLClassPath$FileLoader.getResource(URLClassPath.java:1219) ~[na:na]
at java.base/jdk.internal.loader.URLClassPath.getResource(URLClassPath.java:314) ~[na:na]
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:695) ~[na:na]
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621) ~[na:na]
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:773) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.2.jar:2.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.2.jar:2.11.2]
解决方案
推荐阅读
- esxi - 在 esx 主机重新启动时丢失后自动挂载 esx 范围
- javascript - DatePicker 未转义的拉丁字母字符 n 日期-fns - ReactJS
- anaconda - 试图在 Spyder 中运行 pyodbc
- signtool - 自签名 exe 证书在其他 PC 上被忽略
- python - 如何加载检查点 pyspark 数据框
- ansible-inventory - 有没有办法在使用清单源在 ansible 清单中创建主机时添加主机描述
- javascript - 我想用 Javascript 链接替换 H2 标签
- python - 用于多级分类的部分连接神经网络
- swiftui - 使用 SwiftUI Mapkit 调整地图大小的问题
- azure - 将 Azure 用户托管标识限制为仅在订阅中使用