I wanted to define classes to map into an XML response to be returned by the controller:
@RestController
@RequestMapping("/v1")
@Validated
public class Controller {
@PostMapping(value = "/inquiry", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE)
@ApiResponses(
value = {
@ApiResponse(responseCode = "200", description = "Success", content = {
@Content(mediaType = MediaType.APPLICATION_XML_VALUE, schema = @Schema(implementation = RequestModel.class))
})
}
)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody ResponseModel inquiry(
@Parameter(description = "Request", required = true) @RequestBody RequestModel requestModel) {
return new ResponseModel(
new SubResponse1("value1"),
new SubResponse2("value2")
);
}
}
I tried the following: ResponseModel.java
@JacksonXmlRootElement(localName = "Message", namespace = "abc")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseModel {
@JacksonXmlProperty(localName = "SubResponse1")
private SubResponse1 subResponse1;
@JacksonXmlProperty(localName = "SubResponse2")
private SubResponse2 subResponse2;
}
SubResponse1.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SubResponse1 {
@JacksonXmlProperty(localName = "S", namespace = "abc:def")
private String s;
}
SubResponse2.java
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SubResponse2 {
@JacksonXmlProperty(localName = "T", namespace = "abc:ghi")
private String t;
}
And I was expecting the result would be Expected Result
<Message
xmlns="abc"
xmlns:sub1="abc:def"
xlmns:sub2="abc:ghi">
<SubResponse1>
<sub1:S>value1</sub1:S>
</SubResponse1>
<SubResponse2>
<sub2:T>value2</sub2:T>
</SubResponse2>
</Message>
But the result was Actual Result
<Message xmlns="" xmlns="abc">
<zdef1417610378:SubResponse1 xmlns:zdef1417610378="">
<zdef1574590916:S xmlns:zdef1574590916="abc:def">value1</zdef1574590916:S>
</zdef1417610378:SubResponse1>
<zdef-1648736682:SubResponse2 xmlns:zdef-1648736682="">
<zdef103979484:T xmlns:zdef103979484="abc:ghi">value2</zdef103979484:T>
</zdef-1648736682:SubResponse2>
</Message>
I don't know how to define namespaces at the very top, and somehow the namespaces became two (xmlns="" xmlns="abc") or weird string (zdef1417610378). How should I define my classes to handle the problem?