首页 > 解决方案 > 使用 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]

标签: springspring-bootkotlinfeign

解决方案


推荐阅读