Я работаю над проектом Spring Boot 2.0.5.RELEASE.У меня есть поле в базе данных Oracle, объявленное как CHAR(1)
с преобразователем JPA, следующим образом:
public class CharToBooleanConverter implements AttributeConverter<String, Boolean> {
@Override
public Boolean convertToDatabaseColumn(String s) {
return s.equalsIgnoreCase("t");
}
@Override
public String convertToEntityAttribute(Boolean aBoolean) {
if(aBoolean.equals(true)){
return "t";
} else {
return "f";
}
}
}
Этот преобразователь используется в моем классе StructureElement
дважды:
@Entity
@Table(name = "OBS_STRUCTURE_ELEMENT2")
@SequenceGenerator(name = "structure_element_seq", sequenceName = "structure_element_seq", allocationSize = 1)
public class StructureElement {
@Id
@Column(name = "NO_ELEMENT")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "structure_element_seq")
private long id;
@Column(name = "TAG")
private String tag;
@Column(name = "DESCRIPTION")
private String description;
@Column(name = "SUITE")
private int sequence;
@Column(name = "OPTIONNEL")
@Convert(converter = CharToBooleanConverter.class)
private boolean optional;
@Column(name = "REPETITIF")
@Convert(converter = CharToBooleanConverter.class)
private boolean repetitive;
@ManyToOne
@JoinColumn(name = "NOM_STRUCTURE_TYPE")
private Structure typeStructure;
@Embedded
private PersistenceSignature signature;
}
Проблема в том, что когда я пытаюсь отправить Structure
через RestController, я получаю в консоли следующее:
Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Невозможно записать JSON: Couldне задано значение поля [t] по отражению: [class be.solodoukhin.domain.StructureElement.optional] установщик be.solodoukhin.domain.StructureElement.optional;вложенным исключением является com.fasterxml.jackson.databind.JsonMappingException: не удалось установить значение поля [значение t] путем отражения: [class be.solodoukhin.domain.StructureElement.optional] setter be.solodoukhin.domain.StructureElement.optional (черезцепочка ссылок: be.solodoukhin.domain.Structure ["elements"])]
с ответом 500 Internal Server Error
.
Вот мой метод:
@RestController
@RequestMapping("/structure")
public class StructuresController {
@GetMapping("/{name}")
public ResponseEntity<Structure> getOne(@PathVariable("name") String name)
{
LOGGER.info("Call to StructuresController.getOne with name = " + name);
Optional<Structure> found = this.structureRepository.findById(name);
if(found.isPresent()){
return ResponseEntity.ok(found.get());
}
else
{
return ResponseEntity.badRequest().body(null);
}
}
}
Я пытался использовать специфичную для hibernate аннотацию @Type(type = "true_false")
.Это работает, но при этом в базе данных появляется прописная буква T
или F
.
Я пытался написать сериализатор JSON, который расширяет com.fasterxml.jackson.databind.ser.std.StdSerializer
, используя эту ссылку , но безуспешно.