使用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)
    }
}

但是当我通过邮递员发送get请求时,出现以下错误(通常,当要在网络控制器中调用伪客户端方法时,会出现错误):

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]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...