残りの応答をjsonとして取得しようとしていますが、代わりに文字列として取得しています。
コントローラ
@RestController
@RequestMapping("/api/")
public class someController{
@Autowired
private SomeService someService;
@GetMapping("/getsome")
public Iterable<SomeModel> getData(){
return someService.getData();
}
}
サービス
@Autowired
private SomeRepo someRepo;
public Iterable<someModel> getData(){
return someRepo.findAll();
}
リポジトリ
public interface SomeRepo extends CrudRepository<SomeModel,Integer>{
}
モデル
@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
}
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" }]}"
}
]
フィールドt_colがjsonではなく文字列を返しています。応答としてjsonオブジェクトを取得するにはどうすればよいですか?
データベースに関しては、3つの列はint、varchar、およびvarcharです。
任意の助けいただければ幸いです。ありがとう!!
Json属性をJsonNodeとして定義する必要があります。これにより、Jacksonはそれを読み戻すことができますが、マークは@Transient
であるため、JPAはデータベースに保存しようとしません。
次に、JPAのgetter/setterをコーディングし、JsonNodeからStringに変換して前後に変換できます。 JsonNode json
をgetJsonString
に変換するゲッターString
を定義します。これは「json_string」などのテーブル列にマップできます。次に、JPAからString
を受け取るセッターを定義し、それをJsonNodeに解析して、Jacksonで使用できるようにします。あなたが言うように、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();
}
}
}
@Column
はゲッターで定義されています。JPAがgetJsonString
を使用することを示す必要があり、JPAは一貫性を必要とするため、すべての列のゲッターに@Columns
を付ける必要があります。
@RequestMapping(value = "/getsome", method = RequestMethod.POST, consumes =
"application/json;")
public @ResponseBody
ModelAndView getSome(@RequestBody List<Map<String, String>> request) {
request.stream().forEach(mapsData->{
mapsData.entrySet().forEach(mapData -> {
System.Out.Println("key :"+mapData.getKey() + " " +
" value : " +mapData.getValue());
});
}
});
return new ModelAndView("redirect:/home");
}
DBの回答をfindAll
から(List of Sometype)のようなオブジェクトタイプのリストにキャストし、データを返します。これで問題が解決します。