Spring Boot Protobuf没有为com.google.protobuf.UnknownFieldSet $ Parser类找到序列化程序

问题描述

我想在protobuf中使用spring boot。 简而言之,我编写具有以下结构的演示代码

RestController->获取实体-> Postgres数据库回购->实体到protobuf对象->返回protobuf对象

pom proto依赖性;

<dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>3.12.4</version>
    </dependency>
    <dependency>
        <groupId>com.googlecode.protobuf-java-format</groupId>
        <artifactId>protobuf-java-format</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java-util</artifactId>
        <version>3.13.0</version>
    </dependency>

原始文件

Syntax = "proto3";

package demo;

option java_package = "demo.model";
option java_outer_classname = "DemoProtos";

message DemoDto {
  int64 id = 1;
  string description = 2;    

}

gen.sh文件

#!/usr/bin/env bash
    
SRC_DIR=`pwd`
DST_DIR=`pwd`/../src/main/

echo source:            $SRC_DIR
echo destination root:  $DST_DIR


function gen(){
    D=$1
    echo $D
    OUT=$DST_DIR/$D
    mkdir -p $OUT
    sudo protoc -I=$SRC_DIR --${D}_out=$OUT $SRC_DIR/demo.proto
}    

gen java

我的RestController

@RestController
class DemoRestController {

    @Autowired
    private DemoRepository demoRepository;

    @RequestMapping("/demo/{id}")
    ResponseEntity<DemoProtos.DemoDto> date(@PathVariable Integer id) {
        Optional<Demo> demo = this.demoRepository.findById(id);

        if (demo.isPresent()) {
            Demo dt = demo.get();
            DemoProtos.DemoDto tempDemo = DemoProtos.DemoDto.newBuilder()
                    .setDescription(dt.getDescription())
                    .setId(id)
                    .build();
            return new ResponseEntity<>(tempDemo,HttpStatus.OK);
        }
        return null;
    }
}

演示实体对象

@Entity
@Table(name = "DEMO_TABLE",schema = "SDEMO")
@Data
public class Demo {

    @Id
    private Integer id;

    @Column(name = "description")
    private String description;

}

和应用程序类

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }

    @Bean
    ProtobufHttpMessageConverter protobufHttpMessageConverter() {
        return new ProtobufHttpMessageConverter();
    }

}

当我请求http:// localhost:8080 / demo / 2发生这样的异常时;

org.springframework.web.util.nestedservletexception: Request processing Failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type deFinition error: [simple type,class com.google.protobuf.UnkNownFieldSet$Parser]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDeFinitionException: No serializer found for class com.google.protobuf.UnkNownFieldSet$Parser and no properties discovered to create BeanSerializer (to avoid exception,disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: demo.model.DemoProtos.DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["parserForType"])
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.37.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    ...
Caused by: org.springframework.http.converter.HttpMessageConversionException: Type deFinition error: [simple type,disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: demo.model.DemoProtos.DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["parserForType"])
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:341) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    ...

2020-08-17 12:49:48.031 ERROR 1708168 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing Failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type deFinition error: [simple type,disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: demo.model.DemoProtos.DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["parserForType"])] with root cause

com.fasterxml.jackson.databind.exc.InvalidDeFinitionException: No serializer found for class com.google.protobuf.UnkNownFieldSet$Parser and no properties discovered to create BeanSerializer (to avoid exception,disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: demo.model.DemoProtos.DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["parserForType"])
    at com.fasterxml.jackson.databind.exc.InvalidDeFinitionException.from(InvalidDeFinitionException.java:77) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDeFinition(SerializerProvider.java:1277) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.DatabindContext.reportBadDeFinition(DatabindContext.java:400) ~[jackson-databind-2.11.1.jar:2.11.1]
...

然后我将此参数添加属性文件中。

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

异常更改为;

org.springframework.web.util.nestedservletexception: Request processing Failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type deFinition error: [simple type,class com.google.protobuf.UnkNownFieldSet]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDeFinitionException: Direct self-reference leading to cycle (through reference chain: demo.model.DemoProtos$DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["defaultInstanceForType"])
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.37.jar:4.0.FR]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.37.jar:4.0.FR]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.37.jar:9.0.37]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar:9.0.37]
    ...
Caused by: org.springframework.http.converter.HttpMessageConversionException: Type deFinition error: [simple type,class com.google.protobuf.UnkNownFieldSet]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDeFinitionException: Direct self-reference leading to cycle (through reference chain: demo.model.DemoProtos$DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["defaultInstanceForType"])
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:341) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) ~[spring-webmvc-5.2.8.RELEASE.jar:5.2.8.RELEASE]
    ...
Caused by: com.fasterxml.jackson.databind.exc.InvalidDeFinitionException: Direct self-reference leading to cycle (through reference chain: demo.model.DemoProtos$DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["defaultInstanceForType"])
    at com.fasterxml.jackson.databind.exc.InvalidDeFinitionException.from(InvalidDeFinitionException.java:77) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDeFinition(SerializerProvider.java:1277) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:945) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:722) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializerBase.serializefields(XmlBeanSerializerBase.java:212) ~[jackson-dataformat-xml-2.11.1.jar:2.11.1]
    ...

2020-08-17 11:56:07.430 ERROR 1691529 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing Failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type deFinition error: [simple type,class com.google.protobuf.UnkNownFieldSet]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDeFinitionException: Direct self-reference leading to cycle (through reference chain: demo.model.DemoProtos$DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["defaultInstanceForType"])] with root cause

com.fasterxml.jackson.databind.exc.InvalidDeFinitionException: Direct self-reference leading to cycle (through reference chain: demo.model.DemoProtos$DemoDto["unkNownFields"]->com.google.protobuf.UnkNownFieldSet["defaultInstanceForType"])
    at com.fasterxml.jackson.databind.exc.InvalidDeFinitionException.from(InvalidDeFinitionException.java:77) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDeFinition(SerializerProvider.java:1277) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:945) ~[jackson-databind-2.11.1.jar:2.11.1]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:722) ~[jackson-databind-2.11.1.jar:2.11.1]
    ...

我怎么了,我的问题有什么评论吗? 谢谢

解决方法

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

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

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