Не удалось записать JSON: не удалось установить значение поля [t] по отражению - PullRequest
0 голосов
/ 14 декабря 2018

Я работаю над проектом 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, используя эту ссылку , но безуспешно.

1 Ответ

0 голосов
/ 15 декабря 2018

Разве ваш конвертер не в ту сторону?У вашего convertToDatabaseColumn это происходит от String к Boolean.Конечно, вы хотите, чтобы он перешел от Boolean к String.И 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";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...