Какой тип возвращаемого значения метода контроллера Spring использовать, если я хочу вернуть тип X или Y в зависимости от условия?

Я хочу создать метод в контроллере 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";
    }
}

Метод можно сделать недействительным и использовать базовый поток ответов и писать напрямую. Или используйте составное слово, чтобы вернуть String или SseEmitter. Но я сомневаюсь, что SseEmitter можно отправить в HTTP-ответе. Это игрушечный пример? Какую проблему ты пытаешься решить? Похоже, проблема в XY.

Andrew S 20.06.2024 23:16

1) Можете ли вы показать пример составного типа, который может быть возвращен из контроллера Spring? Я бы предпочел этот подход к изменению типа возвращаемого значения метода на void, потому что тогда подпись метода будет более информативной. 2) Это игрушечный пример, но SseEmitter можно отправить как HTTP-ответ в реальном приложении. 3) Я хочу получить HTTP-запрос, выполнить какую-то задачу, в случае ошибки ответить строкой, в случае успеха ответить SseEmitter.

Vaks 20.06.2024 23:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы бы не стали. То, что вы пытаетесь сделать, противоречит стандартам 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!

Другие вопросы по теме