无法编写JSON:无法通过反射设置字段值[t]

时间:2018-12-14 10:40:04

标签: java json spring hibernate jackson

我正在研究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")。它可以工作,但是会在数据库中产生大写的TF

我尝试编写一个使用此link扩展com.fasterxml.jackson.databind.ser.std.StdSerializer的JSON序列化器,但没有成功。

1 个答案:

答案 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";
    }
}