當我嘗試發出一個 mockmvc 發布請求時,我必須在內容標簽中傳遞一個物件串列,問題是每次我嘗試使用此方法傳遞它時:
public static String asJsonString(final Object obj) {
try {
final ObjectMapper mapper = new ObjectMapper();
final String jsonContent = mapper.writeValueAsString(obj);
return jsonContent;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
我收到此錯誤:
{"status":"NOT_ACCEPTABLE","errors":{"timestamp":"2021-11-29T11:53:11.2020882Z","message":"Wrong message format","details":"JSON parse error: Cannot deserialize instance of `java.util.ArrayList<Compania>` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<Compania>` out of START_OBJECT token\n at [Source: (PushbackInputStream); line: 1, column: 1]"}}
我為僅保存 1 個物件所做的測驗運行良好,但每當我嘗試添加串列時,它都會中斷,這里有我的測驗代碼。
@Test
void successSavePostCompaniaLista() throws Exception {
Compania c1 = new Compania("Compania1 list",
"name1",
"---",
"---",
null,
null);
Compania c2 = new Compania("Compania2 list",
"name2",
"---",
"---",
null,
null);
List<Compania> companias = List.of(c1,c2);
when(companiaRepository.save(any(Compania.class))).then(returnsFirstArg());
this.mockMvc.perform(
post("/companias/lista")
.header("authorization", "Bearer " token)
.content(asJsonString(companias)) //<-- Here gives me errors
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isCreated())
.andExpect(jsonPath("$.result[0].success[0]").isNotEmpty())
.andExpect(jsonPath("$.result[0].success[0].name").value(c1.getName()))
.andExpect(jsonPath("$.result[0].success[1].name").value(c2.getName()));
}
作業原理與此類似,但僅使用一個物件。
http方向,其他都OK。
謝謝!
編輯。這是我要測驗的服務
public Map<String, Object> postListCompanias(List<Compania> companias) {
for (int i = 0; i < companias.size(); i ) {
Compania companiaN = companias.get(i);
companiaN.setId(null);
companiaRepository.save(companias.get(i));
System.out.println(companias.get(i));
}
Map<String, Object> mappedResult = Collections.singletonMap(
"result",
List.of(
Collections.singletonMap(
"success",
companias
)
)
);
return mappedResult;
}
這里是控制器:
@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/lista")
public Map<String, Object> createCompanias(@RequestBody List<Compania> companias) {
return companiaService.postListCompanias(companias);
}
uj5u.com熱心網友回復:
在我看來,問題在于您試圖將以下 JSON 之類的內容傳遞給content:
[
{
"compania1_list": "Compania1 list",
"name1": "name1",
"s": "---",
"s1": "---",
"o": null,
"o1": null
},
{
"compania1_list": "Compania2 list",
"name1": "name2",
"s": "---",
"s1": "---",
"o": null,
"o1": null
}
]
這是一個帶有 2 個 JSON 物件的 JSON 陣列,而不是帶有 2 個 JSON 物件的 JSON 陣列的 JSON 物件。我的猜測是該MockHttpServletRequestBuilder.content()方法不期望像這樣的 JSON。
話雖如此,我會改變你的控制器來接受一個物件而不是一個集合,如下所示:
@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/lista")
public Map<String, Object> createCompanias(@RequestBody CompaniasCreationRequest companiasCreationRequest) {
return companiaService.postListCompanias(companiasCreationRequest.getCompanias());
}
作為CompaniasCreationRequest如下:
public class CompaniasCreationRequest {
private List<Compania> companias;
public CompaniasCreationRequest(List<Compania> companias) {
this.companias = companias;
}
public List<Compania> getCompanias() {
return companias;
}
public void setCompanias(List<Compania> companias) {
this.companias = companias;
}
}
在您的測驗中,這意味著以下更改:
@Test
void successSavePostCompaniaLista() throws Exception {
Compania c1 = new Compania("Compania1 list",
"name1",
"---",
"---",
null,
null);
Compania c2 = new Compania("Compania2 list",
"name2",
"---",
"---",
null,
null);
CompaniasCreationRequest companiasCreationRequest = new CompaniasCreationRequest(List.of(c1,c2));
when(companiaRepository.save(any(Compania.class))).then(returnsFirstArg());
this.mockMvc.perform(
post("/companias/lista")
.header("authorization", "Bearer " token)
.content(asJsonString(companiasCreationRequest))
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andExpect(status().isCreated())
.andExpect(jsonPath("$.result[0].success[0]").isNotEmpty())
.andExpect(jsonPath("$.result[0].success[0].name").value(c1.getName()))
.andExpect(jsonPath("$.result[0].success[1].name").value(c2.getName()));
}
現在您的請求正文將如下所示(這是一種更標準的 JSON 格式):
{
"companias": [
{
"compania1_list": "Compania1 list",
"name1": "name1",
"s": "---",
"s1": "---",
"o": null,
"o1": null
},
{
"compania1_list": "Compania2 list",
"name1": "name2",
"s": "---",
"s1": "---",
"o": null,
"o1": null
}
]
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/370635.html
上一篇:使用執行緒池執行器時獲取“當前沒有會話系結到執行背景關系”
下一篇:如何在回應物體中傳遞多個引數
