问题描述
我想在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 (将#修改为@)