404*_*505 6 spring spring-data spring-data-jpa spring-data-rest spring-boot
我正在尝试以 json 形式获取休息响应,而不是以字符串形式获取。
控制器
@RestController
@RequestMapping("/api/")
public class someController{
@Autowired
private SomeService someService;
@GetMapping("/getsome")
public Iterable<SomeModel> getData(){
return someService.getData();
}
}
Run Code Online (Sandbox Code Playgroud)
服务
@Autowired
private SomeRepo someRepo;
public Iterable<someModel> getData(){
return someRepo.findAll();
}
Run Code Online (Sandbox Code Playgroud)
存储库
public interface SomeRepo extends CrudRepository<SomeModel,Integer>{
}
Run Code Online (Sandbox Code Playgroud)
楷模
@Entity
@Table(name="some_table")
public class SomeModel{
@Id
@Column(name="p_col", nullable=false)
private Integer id;
@Column(name="s_col")
private String name
@Column(name="t_col")
private String json; // this column contains json data
//constructors, getters and setters
}
Run Code Online (Sandbox Code Playgroud)
当我运行localhost:8080/api/getsome时我得到:
[
{
"p_col":1,
"s_col":"someName",
"t_col":"
{\r\n\t"school_name\":\"someSchool\",\t\r\n\t"grade\":"A\",\r\n\t\"class\":
[{\"course\":"abc",\t"course_name\":\"def" }]}"
}
]
Run Code Online (Sandbox Code Playgroud)
字段t_col返回字符串而不是 json。如何获取响应中的 json 对象?
对于数据库来说,三列分别是int、varchar、varchar。
任何帮助,将不胜感激。谢谢 !!
您需要将 json 属性定义为 JsonNode,以便 jackson 可以来回读取它,但 mark 是这样,@Transient因此 JPA 不会尝试将其存储在数据库中。
然后,您可以为 JPA 编写 getter/setter 代码,在其中将 JsonNode 来回转换为 String。您定义一个getJsonString翻译JsonNode json为的 getter String。这个可以映射到表列,例如“json_string”,然后定义一个setter,您可以在其中接收String来自JPA的数据并将其解析为可供杰克逊使用的JsonNode,然后杰克逊会将其转换为json对象而不是字符串正如你提到的。
@Entity
@Table(name = "model")
public class SomeModel {
private Long id;
private String col1;
// Attribute for Jackson
@Transient
private JsonNode json;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
@Column(name ="col1")
public String getCol1() {
return col1;
}
// Getter and setter for name
@Transient
public JsonNode getJson() {
return json;
}
public void setJson(JsonNode json) {
this.json = json;
}
// Getter and Setter for JPA use
@Column(name ="jsonString")
public String getJsonString() {
return this.json.toString();
}
public void setJsonString(String jsonString) {
// parse from String to JsonNode object
ObjectMapper mapper = new ObjectMapper();
try {
this.json = mapper.readTree(jsonString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意,@Column是在 getter 处定义的,因为我们需要指示要使用的 JPA getJsonString,而 JPA 要求一致性,因此所有列的 getter 必须用 标记@Columns。
| 归档时间: |
|
| 查看次数: |
14658 次 |
| 最近记录: |