Sping Boot 控制器建议-如何返回XML而不是JSON?

iezvtpos  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(109)

我有一个控制器建议类,但是我似乎不能让它返回XML,即使我已经使用了@RequestMapping注解。

@RestControllerAdvice
public class ControllerAdvice {    
    @ExceptionHandler(Exception.class)
    @RequestMapping(produces = MediaType.APPLICATION_XML_VALUE)
    public PriceAvailabilityResponse handleControllerErrorXML(final Exception e) {
        e.printStackTrace();
        System.out.println("Exception Handler functional");
    
        PriceAvailabilityResponse priceAvailabilityResponse = new PriceAvailabilityResponse();
        priceAvailabilityResponse.setStatusMessage("Server Error");
        priceAvailabilityResponse.setStatusCode(99);
        
        return priceAvailabilityResponse;
    }
}

请注意@RequestMapping(produces = MediaType.APPLICATION_XML_VALUE)在rest控制器中如何工作,以控制响应的形成方式。
这里有一个例子,说明了PriceAvailabilityResponse在前面提到的代码块中可能是什么。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@Getter
@Setter
public class PriceAvailabilityResponse {
    @JacksonXmlProperty(isAttribute = true, localName = "StatusCode")
    @JsonProperty(value = "StatusCode", required = false)
    private int statusCode = 0;

    @JacksonXmlProperty(isAttribute = true, localName = "StatusMessage")
    @JsonProperty(value = "StatusMessage", required = false)
    private String statusMessage;
}

下面是抛出错误的rest控制器方法示例

@RequestMapping(value = "/error_test", produces = MediaType.APPLICATION_XML_VALUE)
public PriceAvailabilityResponse getPriceResponse() throws Exception{
    int x = 1/0;
    return null;
}

我为这段代码编写了一个模型,根据哪个端点访问微服务来返回JSON和XML,这是绝对必要的。
不幸的是,当我点击/error_test路径时,我的响应总是以JSON格式出现。

我怎样才能强制响应为XML呢?非常感谢您的宝贵时间。

jdgnovmf

jdgnovmf1#

下面的方法应该可以解决您的问题

@RestController
public class TestController {

    @GetMapping(value = "/throw-exception", produces = MediaType.APPLICATION_XML_VALUE)
    public ResponseEntity throwException(){
        throw new CustomException("My Exception");
    }
}

从异常处理程序返回响应实体,并使用它指定媒体类型。

@ControllerAdvice
public class GlobalErrorHandler extends ResponseEntityExceptionHandler {

@ExceptionHandler(value = {CustomException.class})
protected ResponseEntity handleInvalidDataException(
        RuntimeException ex, WebRequest request) {

    PriceAvailabilityResponse priceAvailabilityResponse = new 
    PriceAvailabilityResponse();
    priceAvailabilityResponse.setStatusMessage("Server Error");
    priceAvailabilityResponse.setStatusCode(99);

    return ResponseEntity.status(HttpStatus.BAD_REQUEST)
            .contentType(MediaType.APPLICATION_XML)
            .body(priceAvailabilityResponse);
}

如果没有jackson-dataformat-xml依赖项,请包括它

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.8</version>
</dependency>

相关问题