如何处理映射到“/api”的这个模糊处理程序方法

时间:2021-02-25 22:22:58

标签: java xml spring-boot rest

我了解错误消息的含义 - Spring 无法根据路径确定它应该使用哪种方法,但我缺乏优雅地处理此问题的想法或经验。

基本上,我有 2 个具有相同端点 /api/notification 的控制器:(我在这里省略了一些不相关的细节)

@Slf4j
@RestController
public class MessageController {

    @PostMapping(
        value = "/api/notification",
        consumes= {
        "application/message+xml",
        "text/xml",
        "application/xml"},
        produces = "application/json"
    )
    public ResponseEntity<String> message(@RequestBody Message message) {
        log.info("Handling message for id {}", message.getId());
        handleMessage(message);
        return ResponseEntity.ok("{\"result\":\"Message received\"}");
    }
}

第二个:

@Slf4j
@RestController
public class EventController {

    @PostMapping(
        value = “/api/notification",
        consumes= {
        "application/event+xml",
        "text/xml",
        "application/xml"},
        produces = "application/json"
    )
    public ResponseEntity<String> event(@RequestBody Event event) {
        log.info("Handling event for id {}", event.getId());
        handleEvent(event);
        return ResponseEntity.ok("{\"result\”:\”Event received\"}");
    }
}

所以它们几乎完全相同,除了它们使用 2 个不同的 xml 模式(messageevent),并且它们处理和解析这些 xml 对象的方式也不同(为了简单起见,这里再次省略)。< /p>

所以我的问题是,解决这个问题的最佳方法是什么,并可能将这两者结合起来,同时仍保留相同的端点?不幸的是,我无法更改端点,因为这将是一个重大更改。

我尝试将它们组合在一个控制器中,使用 @RequestBody Object 并使用 instanceof,但这不起作用,而且这似乎也不是一个特别好的主意。

1 个答案:

答案 0 :(得分:0)

您可以执行类似的操作,检查内容类型标头并决定尝试从 XML 字符串解析什么内容。您需要使用 XML 解析器来实现 parseMessage 函数和类似的 parseEvent 函数。

       @PostMapping(
                value = "/api/notification",
                consumes= {
                        "application/message+xml",
                        "application/event+xml",
                        "text/xml",
                        "application/xml"},
                produces = "application/json"
        )
        public ResponseEntity<String> message(HttpEntity<String> httpEntity) {
            final String contentType = httpEntity.getHeaders().get("Content-Type").get(0);
            if (contentType.equals("application/message+xml")) {
                Message m = parseMessage(httpEntity.getBody());
                log.info("Handling message for id {}", message.getId());
                handleMessage(message);
                return ResponseEntity.ok("{\"result\":\"Message received\"}");
            } else if (contentType.equals("application/event+xml")) {
                ... event processing ...
            } else {
                return ResponseEntity.badRequest().build();
            }
        }
相关问题