我有一个实体类,在其他字段中有一个自定义类型字段
@Entity
@Table(name = "something")
public class Test {
@Id
private Integer id;
private <SomethingHere> customTypeObject;
// Other fields, getters, and setters not shown
}
使用这个类,我使用repository.findAll()生成数据的json表示
@Controller
public class TestController {
@AutoWired
private TestRepository repo
@GetMapping("/test")
private List<Test> test() {
return repo.findAll();
}
}
对用户的JSON响应旨在以JSON格式显示自定义类型中的字段。如果我将customTypeObject标记为String,则响应如下所示[{id: 1, customTypeObject: "(1,2)"}]
而我更喜欢这样的回答[{id: 1, customTypeObject: { A: 1, B: 2 }}]
我意识到我可以通过为自定义类型创建另一个实体类来实现这一点,我手动输入字段,但我计划在开发过程中经常增加自定义类型中的字段数量,因此我更希望程序能够为我跟踪字段。
有什么办法可以做到吗?
根据您的示例,我假设您正在存储一个JSON字符串。您可以创建DTO类并使用mapstruct定义从实体到DTO的映射器。您可以使用fasterxml将字符串解析为对象如果我将customTypeObject标记为String,则响应如下[{id: 1, customTypeObject: "(1,2)"}]
// entity class
@Entity
@Table(name = "something")
public class Test {
@Id
private Integer id;
private String customTypeObject;
// Other fields, getters, and setters not shown
}
// DTO class
public class TestDTO {
// same fields as Entity
private Map<String,Object> customTypeObject;
// or private Object customTypeObject;
}
// mapper class
@Mapper
public interface TestMapper {
TestMapper INSTANCE = Mappers.getMapper(TestMapper.class);
ObjectMapper objectMapper = new ObjectMapper();
@Mappings({
@Mapping(source = "test.customTypeObject", target = "customTypeObject", qualifiedByName = "parseCustomObject")
})
TestDTO entityToDto(Test test)
List<TestDTO> entitiesToDto(List<Test> tests)
// the return type of this method must be the same as the datatype for the field in the dto class
@Named("parseCustomObject")
static Map<String,Object> getCustomObject(String objStr) throws JsonProcessingException {
Map<String, Object> objectMap = new HashMap<>();
if (Objects.nonNull(objStr)) {
objectMap = objectMapper.readValue(objStr, Map.class);
}
return objectMap;
}
}
// controller or service class
@Controller
public class TestController {
@AutoWired
private TestRepository repo
@GetMapping("/test")
private List<TestDTO> test() {
List<Test> t = repo.findAll();
return TestMapper.INSTANCE.entitiesToDto(t);
}
}
您也可以使用GSON (com.google.code.gson
)或JSONObject (org.json.JSONObject
)手动创建JSON主体,这样您就可以根据需要操作它这里是一个链接到一篇文章,应该是有帮助的
- https://www.baeldung.com/jackson-vs-gson
由于您正在使用Spring,并且Spring使用Jackson ObjectMapper,您可以为您的customTypeObject
创建另一个类,其中包含您想要显示的字段的相应getter方法(可能最好使用Lombok的@Getter
,这样您就不需要编写getter),如果您有getter方法,Jackson将自动为您创建json。
如果您使用JPA与Hibernate,我建议使用Hibernate类型将JSON列映射到POJO, Map,甚至JsonNode。
下面是一个解释如何使用它的例子
如果您想在数据库中保存一个Custom对象,那么您可以创建自己的Hibernate转换器
<<ul>你也可以尝试更新自定义对象类的toString()
方法。
从你的问题,它是不清楚你想要所需的表示,它是在数据库或在UI字段?