How to marshal into XML response with custom namespaces in Java

29 Views Asked by At

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?

0

There are 0 best solutions below