当前位置: 首页 > 知识库问答 >
问题:

Spring和Jackson 2的新成员。这个bean声明在Spring MVC应用程序中允许什么?

杜良骏
2023-03-14

我继承了一个基本上有几个控制器的spring MVC项目。我在xml文件中发现了一个声明。显然,此声明允许编写基于rest的服务和客户端。有人能举例说明这些声明所带来的明显魔力吗?

<bean id="restClient" class="org.springframework.web.client.RestTemplate">
    <property name="messageConverters">
        <util:list>
            <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
            <bean id="formMessageConverter" class="org.springframework.http.converter.FormHttpMessageConverter"/>
        </util:list>
    </property>
</bean>

提前谢谢你。

共有1个答案

南门朗
2023-03-14

spring提供的resttemplate,用于在网络服务调用期间将java对象转换为所需的输出(html字符串、xml、json等),并插入从服务接收到的响应将被解组回java对象或所需的数据类型。

<property name="messageConverters">
    <util:list>
        <bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
        <bean id="formMessageConverter" class="org.springframework.http.converter.FormHttpMessageConverter"/>
        <bean id="messageConverter"
                    class="org.springframework.http.converter.StringHttpMessageConverter" />

    </util:list>

  //marhsaller and unmarshaller

    <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <property name="marshaller" ref="jaxbMarshaller"></property>
    <property name="unmarshaller" ref="jaxbMarshaller"></property>
    <property name="supportedMediaTypes">
    <list>
       <value>application/xml</value>
       <value>text/xml</value>
       <value>json</value>
     </list>
</property>

通过以上配置,resttemplate将使用这些适当的转换器来处理不同的数据类型,正如我所说的,可能是html、json或应用程序xml

我们所做的就是,在不编写java代码的情况下,我们正在配置resttemplate,并将在spring上下文中进行配置,这种配置适用于任何使用resttemplate的地方。

我这里有个例子

假设我们调用一个服务来检查用户是否是有效用户

class User{
   string userId;

   string password;

}

并且服务响应中的某些代码为1是有效的,而0是无效的

class ValidUser{
   int validCode;
}

首先,您需要编入任何可接受的数据类型,让我们使用Application/xml

我在这里所做的就是通过配置文件

在上面的配置中,我添加了jaxb封送拆收器和解封送拆收器(请参见上面的配置)

我已经配置了封送器和反封送器,并且告诉您在封送和反封送时应该使用哪些可接受的数据类型

最后,下面的配置告诉在编组(请求。用户将被转换为xml)和解组(xml转换回response.valid用户)期间可以接受的java对象

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.request.user</value>
            <value>com.response.validUser</value>

        </list>
    </property>

</bean>

下面是java代码

在这里,您可以直接传递java对象,而resttemplate将毫不费事地处理它!!!

        User user = new User();
        user.setName('test');
        user.setPassword('password');
        // setting media type as xml, and telling convert my user java obj to xml
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_XML);
        HttpEntity<User> entity = new   HttpEntity<User>   (user , headers);

        ResponseEntity<validUser> responseEntity = rest.exchange(URL, HttpMethod.POST, entity, validUser.class);
    // let us assume that service response for valid user <validCode>1<validCode>
    //then validuserreponse obj will have code as 1, let us say valid user.
    ValidUser validUserResponse = responseEntity.getBody();

像wise一样,您也可以处理纯html文本

headers.setContentType(MediaType.TEXT_HTML);

    HttpEntity<String> entity = new HttpEntity<String>(htmlString, headers);
    ResponseEntity<String> htmlStringresponse = rest.postForEntity(URL, entity, String.class);

如果您看到,上面的java代码没有任何消息转换器代码、封送器和解封器逻辑,所有这些都是使用spring配置在一行程序中完成的。

 类似资料:
  • 问题内容: 这是允许的: 但这不是: 为什么不?为什么不能在没有类型的情况下将函数外部的短变量声明视为常规声明?只是为了简化解析? 问题答案: 据伊恩·兰斯·泰勒(Ian Lance Taylor)在公开宣布后不久在此主题中提到: 在顶层,每个声明都以关键字开头。这简化了解析。

  • 如果我有一个封装两个成员的结构,并基于另一个成员更新其中一个,那么只要我这样做就可以了: 也就是说,当我直接提到self时。b 。但当我将do\u stuff()更改为以下内容时: 编译器抱怨:<代码>无法将`*self`借用为不可变,因为` self `。a `也被借用为可变的。 如果我需要执行比返回成员更复杂的操作来获取a.do\u something()的参数,该怎么办?我必须创建一个按值返

  • 我使用json-schema,并希望只允许在此文件中声明的属性通过验证。例如,如果用户在他们的json对象中传递一个“名称”属性,它将失败这个模式,因为“名称”在这里没有作为属性列出。 是否有一些类似于“必需”的功能只允许列出的属性通过?

  • 为什么Java不允许在接口中使用私有成员?有什么特别的原因吗?

  • 我试图在SpringMVC中运行SpringBoot应用程序,在SpringMVCPOM中添加SpringBoot应用程序依赖项,并扫描SpringBoot包,但我面临以下问题

  • 为什么google c/c++风格不允许在多重声明中使用 & 或 * 如上