如何将默认 MessageConverter 设置为 JSON 并添加 jackson-dataformat-xml?

2023-11-26

我有一个工作的 Spring Boot 应用程序,它使用 JSON 作为交换数据格式。现在我必须添加一个仅以 xml 形式发送数据的服务。我添加了jackson-dataformat-xml到我的 pom ,效果很好。

@Service
public class TemplateService {

    private final RestTemplate restTemplate;
    private final String serviceUri;

    public TemplateService (RestTemplate restTemplate, @Value("${service.url_templates}") String serviceUri) {
        this.restTemplate = restTemplate;
        this.serviceUri = serviceUri;
    }

    public boolean createTemplate(Template template) {
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_XML));
        headers.setContentType(MediaType.APPLICATION_XML);
        HttpEntity entity = new HttpEntity<>(template, headers);
        ResponseEntity<Template> response = restTemplate.exchange(serviceUri, HttpMethod.POST, entity, Template.class);
        if (response.getStatusCode().is2xxSuccessful()) {
            // do some stuff
            return true;
        }
        return false;
    }
}

现在不幸的是,添加依赖项后,我的所有其他 POST 方法都默认发送 XML。或者Content被设定为application/xml.但是我想要这里有JSON。

@Service
public class SomeOtherService{

    private final RestTemplate restTemplate;
    private final String anotherUri;

    public SomeOtherService(RestTemplate restTemplate, @Value("${anotherUri.url}") String anotherUri) {
        this.restTemplate = restTemplate;
        this.anotherUri = anotherUri;
    }

    public ComponentEntity doSomething(String projectId, MyNewComponent newComponent) {
        ResponseEntity<MyNewComponent> result = this.restTemplate.exchange(anotherUri ,HttpMethod.POST, new HttpEntity<>(newComponent), MyNewComponent.class);
    //...
    }
}

我没有明确设置标头,因为有很多 POST 请求,而且我不想全部更改。有没有办法设置default Content到 JSON?

到目前为止我尝试过

  1. 添加拦截器。但有时我需要 XML。
  2. 覆盖内容协商
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.defaultContentType(MediaType.APPLICATION_JSON);
    }
  1. setting
restTemplate.setMessageConverters(Collections.singletonList(new MappingJackson2HttpMessageConverter()));

并使用new RestTemplate()在我想要 XML 的服务中。

==> 第三个确实有效,但感觉有点不对。

我本来希望设置默认值Content在某处键入,以便在未设置任何内容的正常情况下使用 JSON,在我显式设置的情况下使用 XMLContent to XML.

谢谢你的帮助。


我们最终发现,消息转换器的顺序非常重要。 Jackson 似乎将 XML 消息转换器放在 JSON 消息转换器之前。因此,我们将 XML 消息转换移至最后,并且它起作用了。

    @Bean
    RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    // move XML converter to the end of list
    List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
    for (int i = 0; i < messageConverters.size() -1 ; i++) {
        if (messageConverters.get(i) instanceof MappingJackson2XmlHttpMessageConverter) {
            Collections.swap(messageConverters, i,messageConverters.size() - 1);
        }
    }

    restTemplate.setMessageConverters(messageConverters);

    // add interceptors if necessary
    restTemplate.setInterceptors(Collections.singletonList(catalogInterceptior()));
    return restTemplate;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将默认 MessageConverter 设置为 JSON 并添加 jackson-dataformat-xml? 的相关文章

随机推荐

  • e.srcElement 在 Firefox 中未定义?

    我正在开发一个网站 现在正在所有浏览器中进行测试 我目前正在 firefox 中进行测试 并且在使用 event sourceElement 时发现错误 我需要 e srcElement 做的是返回值 下面我展示了一个关于如何获取返回的值
  • 关于太多开放数字的警告

    在我创建许多人物的脚本中fix ax plt subplots 我收到警告运行时警告 已打开超过 20 个数字 通过 pyplot 接口创建的图形 matplotlib pyplot figure 会保留到显式关闭为止 并且可能会消耗太多内
  • 在 Web api 控制器中手动验证模型

    我有一个名为 用户 的类和一个属性 名称 public class User Required public string Name get set api控制器方法是 public IHttpActionResult PostUser U
  • @PathVariable 和 @ModelAttribute 的值重叠

    我有一个User存储在会话中的对象 SessionAttributes 以及一个直接的方法装饰 ModelAttribute以便在会话值为空时初始化它 用户类别 Entity Table name USER public class Use
  • 实现包含其他 Parcelable 的 Parcelable 时出现问题

    我正在实现 Parcelable 类 其中有另一个 Parcelable 在 OuterParcelable 类中 Override public void writeToParcel Parcel dest int flags Bundl
  • UnicodeDecodeError,utf-8 无效的连续字节

    我正在尝试使用该代码从日志文件中提取行 with open fichier 01 as f content f readlines print content 但它总是发出错误声明 Traceback most recent call la
  • Python 子进程 readlines() 挂起

    我尝试完成的任务是流式传输 ruby 文件并打印输出 NOTE 我不想一次打印出所有内容 main py from subprocess import Popen PIPE STDOUT import pty import os file
  • 在 WPF 中比较两个位图图像以检查它们是否不同的最快方法

    比较 2 个 BitmapImage 对象的最快方法是什么 一个位于 图像源 属性中 另一个是我在代码中创建的 我可以使用新的位图图像设置图像源 但它会导致闪烁 因为它会一遍又一遍地设置相同的图像 我只想在图像像素与 Image Sourc
  • ZEND,用数据渲染不同的视图

    我有一个问题 因为我想从不同的控制器渲染视图并传递数据 你知道该怎么做吗 我正在尝试 this gt renderScript index index phtml gt entries result 但我的如果 if count this
  • 当父元素为 display:none 时显示 HTML 子元素

    当父元素为 display none 时 是否有任何机制可以显示子元素 这种情况是隐藏选项卡上的验证错误 我想显示错误消息 即使该字段是隐藏的 这里是一个真正简化的 JSFiddle 情况http jsfiddle net vLYnk Ma
  • 如何在 SBT 中切换项目和库依赖关系?

    在 SBT 中声明托管库依赖关系很容易 例如 libraryDependencies Seq org specs2 specs2 1 12 2 test junit junit 4 7 test 虽然在 SBT 中声明项目依赖关系并不那么容
  • 在 iOS 上同时录制和播放(Phonegap 版本)

    我正在使用 Phonegap Build 版本 3 3 0 开发 iOS 和 Android 应用程序 应用程序的主要焦点是录音 并在后台播放另一个音频 音乐 对于这两种情况 我都使用phonegap媒体api和正确的音频文件进行录制 iO
  • concatMap f xs 和 concat $map f xs 之间的区别?

    想必他们做的是完全相同的事情concatMap f xs and concat map f xs 我为什么要选择其中之一而不是另一个 我想这可能是一种优化 如果是这样 GHC 7 8 仍然是这种情况吗 情况是这样的concatMap f x
  • Skype API 消息输出

    我如何从 Skype 接收消息并将其输出到我的应用程序 textbox1 Text 我在 skype4com 文档中寻找它 但没有找到任何内容 要监听聊天消息 您可以执行以下操作 First make a reference to skyp
  • JSON,替换引号和斜杠,但是用什么替换呢?

    我有一个忘恩负义的任务 就是在 Java 中手动构建 JSON 字符串 没有任何框架 只有一个 StringBuilder 我知道这很糟糕 但这只是原型的一部分 下次我会做得更好 我的问题 我怎样才能把字符串 gt Some text WI
  • 如何使用node-http-proxy进行HTTP到HTTPS的路由?

    这是我正在使用的模块版本 npm list g grep proxy email protected Web 服务调用我的机器 我的任务是根据请求正文的内容使用附加查询参数将请求代理到不同的 url 和主机 var http require
  • Python 3.5 UnicodeDecodeError 对于 utf-8 格式的文件(语言为“ang”,古英语)

    这是我第一次使用 StackOverflow 提问 但多年来你们集体保存了我的许多项目 让我感觉宾至如归 我正在使用 Python3 5 和 nltk 来解析完整的古英语语料库 该语料库以 77 个文本文件和一个 XML 文档的形式发布给我
  • 检查我的提交在 emacs/git 中是否有“import pdb”?

    我承诺import pdb pdb set trace 经常 有什么方便的方法可以阻止我这样做吗 我使用 emacs git magit 为了完整起见 以下是如何检查索引中版本的内容 构建尤金的回答并进行了一些更改 未作为完整的钩子进行测试
  • Razor 语法在编译前在视图中给出错误(无智能感知)

    我正在浏览 NuGet 包列表 并且正在更新 bootstrap jQuery 等所有内容 但是当我这样做时 我不假思索地更新了微软 欧文和另一个包 可能是 EF 或其他东西 它是一个主要版本更新 哎呀 我不得不通过删除我的项目 从源代码控
  • 如何将默认 MessageConverter 设置为 JSON 并添加 jackson-dataformat-xml?

    我有一个工作的 Spring Boot 应用程序 它使用 JSON 作为交换数据格式 现在我必须添加一个仅以 xml 形式发送数据的服务 我添加了jackson dataformat xml到我的 pom 效果很好 Service publ