Я использую protobufs с этим конкретным определением.
message Hash {
string category = 1;
repeated KVPair content = 2;
}
message KVPair {
string key = 1;
string value = 2;
}
Я хочу отправить это как JSON с моим приложением весенней загрузки.
Я добавил этот пакет в мои зависимости gradle:
compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.6.1'
Когда я пытаюсь вывести сгенерированный хеш-объект с этим кодом:
@RestController
@RequestMapping("/api/crm/")
public class KVController {
private final KVService kvService;
public KVController(KVService kvService) {
this.kvService = kvService;
}
@GetMapping("kv/{category}")
public Hash getHash(@PathVariable String category) {
Hash hash = kvService.retrieve(category);
return hash;
}
}
Выдает это исключительное исключение:
Вызывается: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: прямая самостоятельная ссылка, ведущая к циклу (через цепочку ссылок: com.blaazha.crm.proto.Hash ["unknownFields"] -> com.google. protobuf.UnknownFieldSet [ "defaultInstanceForType"])
в com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from (InvalidDefinitionException.java:77) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition (SerializerProvider.java:1191) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference (BeanPropertyWriter.java:944) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:721) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:719) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.BeanSerializer.serialize (BeanSerializer.java:155) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField (BeanPropertyWriter.java:727) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields (BeanSerializerBase.java:719) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.BeanSerializer.serialize (BeanSerializer.java:155) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize (DefaultSerializerProvider.java:480) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue (DefaultSerializerProvider.java:319) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ObjectWriter $ Prefetch.serialize (ObjectWriter.java:1396) ~ [jackson-databind-2.9.6.jar: 2.9.6]
в com.fasterxml.jackson.databind.ObjectWriter.writeValue (ObjectWriter.java:913) ~ [jackson-databind-2.9.6.jar: 2.9.6]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal (AbstractJackson2HttpMessageConverter.java:286) ~ [spring-web-4.3.18.RELEASE.jar: 4.3.18.RELEASE]
... 58 общих кадров пропущено
kvService возвращает данные только из redis. Он анализирует тип данных Hash (https://redis.io/topics/data-types)) для объекта Hash, определенного в proto. Где Hash-> category является главным ключом хэша, а значения в типе данных hash redis преобразуются в KVPair, определенный в proto. Я не могу показать весь исходный код, потому что он вызывает другие системы и исходный код очень длинный.
kvService возвращает действительный объект Hash, но возникает исключение, когда я возвращаю этот объект Hash, и Spring пытается преобразовать его в JSON.
важные зависимости в моем build.gradle:
def versions = [
logback: '1.2.3',
owner: '1.0.10',
jackson: '2.9.6',
guava: '25.1-jre',
guice: '4.2.0',
grpc: '1.9.1',
protoc: '3.5.1',
redis: '2.9.0',
]
зависимости {
compile group: 'ch.qos.logback', name: 'logback-classic', version: versions.logback
compile group: 'org.aeonbits.owner', name: 'owner', version: versions.owner
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: versions.jackson
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: versions.jackson
compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: versions.jackson
compile group: 'com.google.guava', name: 'guava', version: versions.guava
compile group: 'com.google.inject', name: 'guice', version: versions.guice
compile group: 'io.grpc', name: 'grpc-netty', version: versions.grpc
compile group: 'io.grpc', name: 'grpc-protobuf', version: versions.grpc
compile group: 'io.grpc', name: 'grpc-stub', version: versions.grpc
compile 'org.glassfish:javax.annotation:10.0-b28'
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.1'
compile group: 'javax.activation', name: 'activation', version: '1.1.1'
compile group: 'redis.clients', name: 'jedis', version: versions.redis
}
Как вы можете видеть в моем определении protobuf, нет никаких ссылок на себя.
Есть ли какой-нибудь возможный способ решить эту проблему?