Я экспериментирую с приложением Spring 4 WebSocket STOMP. Есть ли способ явно указать тип содержимого возвращаемого сообщения, созданного обработчиком? По умолчанию обработчик ниже производит application/json и обрабатывается соответствующим преобразователем сообщений.
@Controller
public class ProductController {
@MessageMapping("/products/{id}")
public String getProduct(@DestinationVariable int id) {
return getProductById(id);
}
}
Я ищу что-то вроде @RequestMapping(produces = "text/xml") в Spring MVC.
ОБНОВЛЕНИЕ (ответ на ответ Россена):
В идеале я хотел бы иметь возможность возвращать оба формата в зависимости от того, что запрашивает пользователь. Но если бы мне пришлось выбирать, я бы сказал XML и почти никогда JSON (XML — это просто пример, мы используем двоичный формат). Я пошел по второму предложенному вами пути - настроил пользовательские конвертеры вместо стандартных.
- Я реализовал пользовательский
MessageConverter, расширяющийAbstractMessageConverter. В конструкторе я зарегистрировал соответствующий поддерживаемый MimeType. - Затем я зарегистрировал свой собственный преобразователь, переопределив
WebSocketMessageBrokerConfigurerconfigureMessageConverters, и вернулfalseиз метода, чтобы не добавлять преобразователи по умолчанию. - Как только мой контроллер возвращает значение, я получаю NPE в
SendToMethodReturnValueHandlerpostProcessMessage. Это происходит потому, чтоCompositeMessageConverterсодержит только один конвертер - мой пользовательский. Но мой преобразователь не проходит проверкуsupportsMimeTypeAbstractMessageConverter, аtoMessageAbstractMessageConverterвозвращаетnull. Этоnullвызывает исключение вpostProcessMessage.
В качестве обходного пути я могу зарегистрировать дополнительный MimeType по умолчанию application/json для своего пользовательского конвертера. Но мне он кажется слишком грязным.