Я экспериментирую с приложением 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. - Затем я зарегистрировал свой собственный преобразователь, переопределив
WebSocketMessageBrokerConfigurer
configureMessageConverters
, и вернулfalse
из метода, чтобы не добавлять преобразователи по умолчанию. - Как только мой контроллер возвращает значение, я получаю NPE в
SendToMethodReturnValueHandler
postProcessMessage
. Это происходит потому, чтоCompositeMessageConverter
содержит только один конвертер - мой пользовательский. Но мой преобразователь не проходит проверкуsupportsMimeType
AbstractMessageConverter
, аtoMessage
AbstractMessageConverter
возвращаетnull
. Этоnull
вызывает исключение вpostProcessMessage
.
В качестве обходного пути я могу зарегистрировать дополнительный MimeType по умолчанию application/json
для своего пользовательского конвертера. Но мне он кажется слишком грязным.