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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Spring 中使用自定義解析器返回 HTTP 狀態(tài) BAD_REQUEST

在 Spring 中使用自定義解析器返回 HTTP 狀態(tài) BAD_REQUEST

慕森王 2023-03-09 15:32:32
我正在使用Spring Boot 1.5.15開發(fā) REST API 。我已經(jīng)實(shí)施了一個(gè)客戶HandlerMethodArgumentResolver來映射 HTTP 標(biāo)頭。具體來說,我分配了 HTTP header 的值Some-Header,刪除了前綴“XXX”。首先,我定義了一個(gè)自定義注解。@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.PARAMETER)public @interface SomeHeader {}然后,我實(shí)現(xiàn)了一個(gè)自定義解析器。public class SomeHeaderArgumentResolver implements HandlerMethodArgumentResolver {    @Override    public boolean supportsParameter(MethodParameter parameter) {        return parameter.getParameterAnnotation(SomeHeader.class) != null;    }    @Override    public Object resolveArgument(MethodParameter parameter,                                  ModelAndViewContainer mavContainer,                                  NativeWebRequest webRequest,                                  WebDataBinderFactory binderFactory) {        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();        final String headerValue = request.getHeader("Some-Header");        return headerValue.replace("XXX ", "");    }}最后,我讓 Spring 知道配置類中的解析器。@Configurationpublic class WebMvcConfig extends WebMvcConfigurerAdapter {    @Override    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {        argumentResolvers.add(new SomeHeaderArgumentResolver());    }}現(xiàn)在,我可以在我需要的任何控制器中使用以下映射。@PostMapping("/some/paath")public void someMethod(@SomeHeader String someHeaderValue) {   // Method body...}但是,Some-Header信息對(duì)我來說是強(qiáng)制性的。我希望如果它不存在,Spring 會(huì)向調(diào)用者返回 400 Bad Request 響應(yīng)。這與我使用注釋可以獲得的行為相同@RequestHeader("Some-Header")。我可以復(fù)制相同的行為嗎?可能,我不想使用專用的控制器建議。
查看完整描述

3 回答

?
拉風(fēng)的咖菲貓

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊

您可以為任何情況聲明自己的異常,并在控制器中設(shè)置 ExceptionHandler 以返回正確的 http-status。


@ResponseStatus(HttpStatus.BAD_REQUEST)

@ExceptionHandler({SameHeaderException.class})

public Object onSameHeaderException(SameHeaderException e) {

    return ImmutableMap.of("reason", e.getMessage());

}

因此,如果標(biāo)頭不存在,您可以拋出此異常:


if (someHeaderValue == null) { throw new SameHeaderException(); }


查看完整回答
反對(duì) 回復(fù) 2023-03-09
?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊

RequestHeaderMethodArgumentResolver如果您看到which is used for的實(shí)現(xiàn),您將看到抽象類方法@RequestHeader的重寫實(shí)現(xiàn),如下所示:handleMissingValueAbstractNamedValueMethodArgumentResolver


@Override

protected void handleMissingValue(String name, MethodParameter parameter) throws ServletRequestBindingException {

        throw new ServletRequestBindingException("Missing request header '" + name +

                "' for method parameter of type " + parameter.getNestedParameterType().getSimpleName());

}

該handleMissingValue方法用于resolveArgument的方法中AbstractNamedValueMethodArgumentResolver,它RequestHeaderMethodArgumentResolver根據(jù)某些條件進(jìn)行擴(kuò)展。因此,當(dāng)標(biāo)頭不存在并ServletRequestBindingException拋出時(shí),SpringDefaultHandlerExceptionResolver將處理該問題并發(fā)送400響應(yīng)。


這就是驗(yàn)證在@RequestHeader. resolveArgument所以你可以在你的類的方法中實(shí)現(xiàn)類似的東西,SomeHeaderArgumentResolver如下所示:


public class SomeHeaderArgumentResolver implements HandlerMethodArgumentResolver {

    @Override

    public boolean supportsParameter(MethodParameter parameter) {

        return parameter.getParameterAnnotation(SomeHeader.class) != null;

    }


    @Override

    public Object resolveArgument(MethodParameter parameter,

                                  ModelAndViewContainer mavContainer,

                                  NativeWebRequest webRequest,

                                  WebDataBinderFactory binderFactory) {

        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();

        final String headerValue = request.getHeader("Some-Header");

        if(headerValue != null){

           return headerValue.replace("XXX ", "");

        } else {

           //handle scenario if header absent with ServletRequestBindingException

        }

       }

    }


查看完整回答
反對(duì) 回復(fù) 2023-03-09
?
富國(guó)滬深

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊

我明白了擴(kuò)展哪個(gè)類是讓 Spring 發(fā)揮魔力的正確類。


RequestHeaderMethodArgumentResolverSpring 用來解析 Java 對(duì)象中的 HTTP 標(biāo)頭值的類擴(kuò)展了抽象類AbstractNamedValueMethodArgumentResolver。此類允許您使用createNamedValueInfo方法指定標(biāo)頭值是否具有某些默認(rèn)值。


所以,它遵循代碼。


public class SomeHeaderArgumentResolver extends AbstractNamedValueMethodArgumentResolver {

    @Override

    protected NamedValueInfo createNamedValueInfo(MethodParameter parameter) {

        // The second parameter specifies if the value is required, 

        // and the third if there is some default value.

        return new NamedValueInfo("", true, null);

    }


    @Override

    protected Object resolveName(String name, 

                                 MethodParameter parameter, 

                                 NativeWebRequest request) {

        final String headerValue = request.getHeader("Some-Value");

        if (StringUtils.isEmpty(headerValue)) {

            // Returning null tells Spring that there is no value for the parameter

            return null;

        }

        return headerValue.replace("XXX ", "");

    }


    @Override

    public boolean supportsParameter(MethodParameter parameter) {

        return (parameter.hasParameterAnnotation(SomeHeader.class) &&

                !Map.class.isAssignableFrom(

                    parameter.nestedIfOptional().getNestedParameterType()));

    }

}

我唯一不喜歡的是我正在使用為處理命名值而開發(fā)的結(jié)構(gòu),但我沒有命名值。


希望能幫助到你。


查看完整回答
反對(duì) 回復(fù) 2023-03-09
  • 3 回答
  • 0 關(guān)注
  • 238 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)