第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 ResponseBodyAdvice 響應不帶雙引號的字符串正文數據?

如何使用 ResponseBodyAdvice 響應不帶雙引號的字符串正文數據?

浮云間 2023-10-13 09:49:06
我使用springboot框架。我需要加密正文數據(從 json 到加密字符串)。所以我將 ResponseBodyAdvice.java 與 @ControllerAdvice 一起使用,但有一個問題,它總是用雙引號響應加密數據(例如“hello”),我需要只響應 hello 而不是“hello”。@Overridepublic Object beforeBodyWrite(...) {response.getHeaders().set("content-type", "text/plain;charset=UTF-8");//some codes..String result = "hello";return result;}它響應“你好”(我需要不帶雙引號的數據)在控制器類中,它僅響應 hello(不帶雙引號)。請參閱下面的代碼。  @ApiOperation(value = "absdfasdf", produces = "text/plain")  @GetMapping("/absd")  public String asdfasdf() {    return "hello";  }
查看完整描述

1 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

您需要檢查您的 MessageConverters 以確保 StringMessageConverter 在 MappingJackson2HttpMessageConverter 之前。否則,將選擇 JSON MessageConverter 來序列化字符串并添加額外的雙引號。


@Component

public class MyWebMvcConfigurer implements WebMvcConfigurer {

    @Override

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        // check converter order here

    }

}

如以下spring源碼,流程為:

  1. 選擇消息轉換器

  2. 在 ResponseBodyAdvice 中調用 beforeBodyWrite 方法

  3. 轉換消息

AbstractMessageConverterMethodProcessor.java

// choose a message converter

if (genericConverter != null ?

                        ((GenericHttpMessageConverter) converter).canWrite(targetType, valueType, selectedMediaType) :

                        converter.canWrite(valueType, selectedMediaType)) {

                    // invoke beforeBodyWrite

                    body = getAdvice().beforeBodyWrite(body, returnType, selectedMediaType,

                            (Class<? extends HttpMessageConverter<?>>) converter.getClass(),

                            inputMessage, outputMessage);

                    if (body != null) {

                        Object theBody = body;

                        LogFormatUtils.traceDebug(logger, traceOn ->

                                "Writing [" + LogFormatUtils.formatValue(theBody, !traceOn) + "]");

                        addContentDispositionHeader(inputMessage, outputMessage);

                        if (genericConverter != null) {

                            genericConverter.write(body, targetType, selectedMediaType, outputMessage);

                        }

                        else {

                            // convert message

                            ((HttpMessageConverter) converter).write(body, selectedMediaType, outputMessage);

                        }

                    }

事實是我們無法更改 ResponseBodyAdvice 中的 MessageConverter。但我們可以自定義一個Dynamic MessageConverter。例如:


public class DynamicMessageConverter implements HttpMessageConverter<Object> {


    private final HttpMessageConverter<Object> jsonConverter;

    private final HttpMessageConverter<String> stringConverter;


    public DynamicMessageConverter(HttpMessageConverter<Object> jsonConverter, HttpMessageConverter<String> stringConverter) {

        this.jsonConverter = jsonConverter;

        this.stringConverter = stringConverter;

    }


    @Override

    public boolean canWrite(Class clazz, MediaType mediaType) {

        return jsonConverter.canWrite(clazz, mediaType) || stringConverter.canWrite(clazz, mediaType);

    }


    @Override

    public List<MediaType> getSupportedMediaTypes() {

        List<MediaType> jsonMediaTypes = jsonConverter.getSupportedMediaTypes();

        List<MediaType> stringMediaTypes = stringConverter.getSupportedMediaTypes();

        List<MediaType> all = new ArrayList<>();

        all.addAll(jsonMediaTypes);

        all.addAll(stringMediaTypes);

        return all;

    }


    @Override

    public void write(Object o, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {

        if (o instanceof String) {

            stringConverter.write((String) o, contentType, outputMessage);

        } else {

            jsonConverter.write(o, contentType, outputMessage);

        }

    }


    @Override

    public boolean canRead(Class clazz, MediaType mediaType) {

        return false;

    }


    @Override

    public Object read(Class clazz, HttpInputMessage inputMessage) throws HttpMessageNotReadableException {

        throw new UnsupportedOperationException();

    }

}

然后啟用它


    @Override

    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();

        StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();

        DynamicMessageConverter dynamicMessageConverter = new DynamicMessageConverter(jsonConverter, stringConverter);

        converters.add(0, dynamicMessageConverter);

    }

直接通過response來寫似乎更簡潔。


    @Override

    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {

        response.getHeaders().set("content-type", "text/plain;charset=UTF-8");


        //some codes..


        String result = "hello";


        try (OutputStream stream = response.getBody()) {

            stream.write(result.getBytes("utf-8"));

            stream.flush();

        } catch (IOException e) {

            // log ex

        }

        return null;

    }


查看完整回答
反對 回復 2023-10-13
  • 1 回答
  • 0 關注
  • 331 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號