1-8 SpringMVC常用视图Json序列化反序列化、Xml

1、视图解析的实现基础

ViewResolver 与 View 接口

    AbstractCachingViewResolver

    UrlBaseViewResolver

    FreeMarkerViewResolver

    ContentNegotiatingViewResolver

    InternalResourceViewResolver

 

DispatcherServlet中的视图解析逻辑

initStrategies()

    initViewResolvers()初始化了对应ViewResolver

doDispatch()

    processDispatchResult()

    返回没有视图的话 尝试RequestToViewNameTranslator

    resolveViewName()解析View对象

 

使用@ResponseBody的情况

在HandlerAdapter.handle()的中完成了Response输出

    RequestMappingHandlerAdapter.invokeHandlerMethod()

        HandlerMethodReturnValueHandlerComposite.handlerReturnValue()

            RequestResponseBodyMethodProcessor.handleReturnValue()

                genericConverter.write(body,... ...)

 

两种不同的重定向前缀

redirect 会丢失之前的信息

forward

 

2、常用视图 Json、Xml

序列化与反序列化:

extends StdDeserializer<?>  \  extends StdSerializer<?>

MoneyDeserializable

package com.example.ribi.support;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;

@JsonComponent
public class MoneyDeserializable extends StdDeserializer<Money> {

    protected MoneyDeserializable() {
        super(Money.class);
    }

    @Override
    public Money deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        return Money.of(CurrencyUnit.of("CNY"),p.getDecimalValue());
    }
}

MoneySerializable

package com.example.ribi.support;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import org.joda.money.Money;
import org.springframework.boot.jackson.JsonComponent;

import java.io.IOException;

@JsonComponent
public class MoneySerializable extends StdSerializer<Money> {
    protected MoneySerializable() {
        super(Money.class);
    }

    @Override
    public void serialize(Money value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeNumber(value.getAmount());
    }
}

Controller

    @PostMapping(path = "/addJsonCoffee",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Coffee addJsonCoffeeWithoutBindingResult(@RequestBody Coffee coffee){
        return coffee;
    }

Pom 

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-hibernate5</artifactId>
            <version>2.9.8</version>
        </dependency>

 Main


    //支持Json缩进
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer(){
	    return builder -> builder.indentOutput(true);
    }

    //支持HibernateModule
    @Bean
    public Hibernate5Module hibernate5Module(){
	    return new Hibernate5Module();
    }

Test

localhost:8080/user/addJsonCoffee

Content-Type -> application/json;charset=utf-8
Accept -> application/json

{
    "name": "moca",
    "money": 12
}

localhost:8080/user/addJsonCoffee

Content-Type -> application/json;charset=utf-8
Accept -> application/xml

<Coffee>
    <name>moca</name>
    <money>12.00</money>
</Coffee>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值