我正在研究Spring Boot 2.0.5.RELEASE项目。
我在使用JPA转换器声明为CHAR(1)
的Oracle数据库中有一个字段,如下所示:
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;
}
问题是,当我尝试通过RestController发送Structure
时,会在控制台中收到以下消息:
已解决的[org.springframework.http.converter.HttpMessageNotWritableException:无法编写JSON:无法通过反射设置字段值[t]值:be.solodoukhin的[setter类] setter。 domain.StructureElement.optional;嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:无法通过反射设置字段值[t]值:be.solodoukhin.domain.StructureElement.optional的设置方法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);
}
}
}
我尝试使用休眠特定的注释@Type(type = "true_false")
。它可以工作,但是会在数据库中产生大写的T
或F
。
我尝试编写一个使用此link扩展com.fasterxml.jackson.databind.ser.std.StdSerializer
的JSON序列化器,但没有成功。
答案 0 :(得分:0)
您的转换器不是错误的方式吗?您的convertToDatabaseColumn
从字符串到布尔值。当然,您希望它从布尔值变成字符串。 convertToEntityAttribute
从String变成Boolean。
我怀疑转换程序返回的值“ t”或“ f”不能再放入实体的布尔字段中。
我认为应该...
public class CharToBooleanConverter implements AttributeConverter<Boolean, String> {
@Override
public Boolean convertToEntityAttribute(String s) {
return s != null && s.equalsIgnoreCase("t");
}
@Override
public String convertToDatabaseColumn(Boolean aBoolean) {
return (aBoolean != null && aBoolean) ? "t" : "f";
}
}