Я хочу создать метод в контроллере Spring, который возвращает String или SseEmitter в зависимости от условия.
Какой тип возвращаемого значения мне следует указать в сигнатуре метода?
@GetMapping("/test")
public WHAT_TO_WRITE_HERE test() {
if (MyCondition) {
SseEmitter emitter = new SseEmitter();
//Fill SseEmitter with data, not related to question
return emitter;
} else {
return "String";
}
}
1) Можете ли вы показать пример составного типа, который может быть возвращен из контроллера Spring? Я бы предпочел этот подход к изменению типа возвращаемого значения метода на void, потому что тогда подпись метода будет более информативной. 2) Это игрушечный пример, но SseEmitter
можно отправить как HTTP-ответ в реальном приложении. 3) Я хочу получить HTTP-запрос, выполнить какую-то задачу, в случае ошибки ответить строкой, в случае успеха ответить SseEmitter.
Вы бы не стали. То, что вы пытаетесь сделать, противоречит стандартам REST. Вы сломаете каждый клиент REST, который потребует специальной обработки вашего API.
В соответствии со стандартом REST API ваш метод возвращает SseEmitter
. В случае успеха платформа будет переведена в 200 OK
и вернет ваш объект, сериализованный в JSON. Если возникла ошибка, вы должны поставить ResponseStatusException
и поместить туда код состояния и сообщение об ошибке, которые будут правильно переведены, а код состояния и сообщение об ошибке будут там, где их ожидают клиенты.
Не следует этого делать, поскольку это запутает клиентов API.
Но предположим, что вы хотите сделать это в целях тестирования.
Затем вы можете просто установить Object
в качестве типа возвращаемого значения.
Вот пример
@RestController
@RequestMapping("/api")
public class DemoController {
@GetMapping("/demo")
public Object demo() {
if (new Random().nextBoolean()) {
return "Hello, World!";
} else {
return new User("John Doe", "[email protected]");
}
}
}
@Data
@AllArgsConstructor
class User {
private String name;
private String email;
}
В зависимости от условия конечная точка вернется
GET http://localhost:8080/api/demo
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 21 Jun 2024 05:20:41 GMT
{
"name": "John Doe",
"email": "[email protected]"
}
или
GET http://localhost:8080/api/demo
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 13
Date: Fri, 21 Jun 2024 05:24:56 GMT
Hello, World!
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Метод можно сделать недействительным и использовать базовый поток ответов и писать напрямую. Или используйте составное слово, чтобы вернуть
String
илиSseEmitter
. Но я сомневаюсь, чтоSseEmitter
можно отправить в HTTP-ответе. Это игрушечный пример? Какую проблему ты пытаешься решить? Похоже, проблема в XY.