我了解错误消息的含义 - 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 模式(message
和 event
),并且它们处理和解析这些 xml 对象的方式也不同(为了简单起见,这里再次省略)。< /p>
所以我的问题是,解决这个问题的最佳方法是什么,并可能将这两者结合起来,同时仍保留相同的端点?不幸的是,我无法更改端点,因为这将是一个重大更改。
我尝试将它们组合在一个控制器中,使用 @RequestBody Object
并使用 instanceof
,但这不起作用,而且这似乎也不是一个特别好的主意。
答案 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();
}
}