স্প্রিং এমভিসি @ প্যাট ভার্ভেয়েবল সহ ডট (।) কেটে ফেলা হচ্ছে


361

এটি প্রশ্নের ধারাবাহিকতা বসন্তের এমভিসি @ প্যাথভ্যারেবল কেটে ফেলা হচ্ছে

স্প্রিং ফোরাম জানিয়েছে যে এটি কন্টেন্টনেগোটিয়েশন ম্যানেজারের অংশ হিসাবে (3.2 সংস্করণ) স্থির করেছে। নীচের লিঙ্কটি দেখুন।
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632

আমার আবেদনের অনুরোধে .কমের সাথে প্যারামিটারটি কেটে গেছে।

এই নতুন বৈশিষ্ট্যটি কীভাবে ব্যবহার করতে হয় কেউ আমাকে ব্যাখ্যা করতে পারেন? এটি কীভাবে এক্সএমএল কনফিগারযোগ্য?

দ্রষ্টব্য: স্প্রিং ফোরাম- # 1 স্প্রিং এমভিসি @ পট ভার্ভেবল সহ ডট (।) কেটে ফেলা হচ্ছে

উত্তর:


485

আমি যতদূর জানি এই সমস্যাটি কেবল অনুরোধম্যাপিংয়ের শেষে পথচলযোগ্য হিসাবে উপস্থিত হয়।

আমরা অনুরোধ ম্যাপিং মধ্যে রেজেক্স অ্যাডন সংজ্ঞা দিয়ে সমাধান করতে সক্ষম হয়েছিল।

 /somepath/{variable:.+}

1
ধন্যবাদ, আমি মনে করি এই ফিক্সটি আগেও পাওয়া যায় (3.2 ভি এর আগে) ?. তবে আমি এই ফিক্সটি পছন্দ করি না; যেহেতু এটি সমস্ত ইউআরএল যা আমার অ্যাপ্লিকেশনটিতে পরিচালনা করা দরকার ... এবং ভবিষ্যতের ইউআরএল বাস্তবায়নও
এটির

4
এখানে আমি বসন্ত 3.0.5 এ সমস্যাটি কীভাবে সমাধান করেছি<!-- Spring Configuration needed to avoid URI using dots to be truncated --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false" /> </bean>
ফরিদ

11
@ মারিউস, সিনট্যাক্সটি {variable_name:regular_expression}, সুতরাং এখানে আমাদের নাম পরিবর্তনশীল রয়েছে variable, যা রেগেক্স ব্যবহার করে মানটি মিলবে .+( .যার অর্থ 'কোনও অক্ষর' এবং +যার অর্থ 'এক বা একাধিক বার')।
মিশা রিবাক

4
@ স্টেফানহবারল আপনি যদি variableনিয়মিতভাবে মেলে তবে বসন্ত তার প্রত্যয় সনাক্তকরণ বৈশিষ্ট্যগুলি ব্যবহার করে এবং বিন্দুর পরে সমস্ত কিছু ছিন্ন করে। আপনি যখন রেজিপক্স ম্যাচিং ব্যবহার করেন, তখন সেই বৈশিষ্ট্যগুলি ব্যবহার করা হয় না - ভেরিয়েবল কেবল আপনার সরবরাহিত রেজিএক্সএক্সের সাথে মেলে।
মিশা রিবাক

9
"variable:.+"যখন ভেরিয়েবলে একাধিক ডট থাকে তখন @মার্টিন কাজ করে না। যেমন বিশ্রামের পথের শেষে ইমেলগুলি রাখা /path/abc@server.com.au। কন্ট্রোলার এমনকি কল হয় না, কিন্তু এটি শুধুমাত্র যখন একটি মাত্র বিন্দু আছে কাজ করে /path/abc@server.com। কোনও ধারণা কেন এবং / বা একটি কার্যবিধির?
বোহেমিয়ান

242

স্প্রিং বিবেচনায় গত ডট পিছনে কিছু যেমন একটি ফাইল এক্সটেনশন হল যে .jsonবা.xml এবং এটি আপনার প্যারামিটারটি পুনরুদ্ধার করতে ট্রুকিয়েট করে।

সুতরাং আপনার যদি /somepath/{variable}:

  • /somepath/param, /somepath/param.json, /somepath/param.xmlবা /somepath/param.anythingমান সহ কোনো PARAM পরিণাম ডেকে আনবেparam
  • /somepath/param.value.json, /somepath/param.value.xmlবা /somepath/param.value.anythingমান সহ একটি পরম ফলাফলparam.value

আপনি যদি নিজের ম্যাপিংকে /somepath/{variable:.+}প্রস্তাবিত হিসাবে পরিবর্তন করেন তবে সর্বশেষটি সহ যে কোনও বিন্দুটিকে আপনার প্যারামিটারের অংশ হিসাবে বিবেচনা করা হবে:

  • /somepath/param মান সহ একটি পরম হবে param
  • /somepath/param.json মান সহ একটি পরম হবে param.json
  • /somepath/param.xml মান সহ একটি পরম হবে param.xml
  • /somepath/param.anything মান সহ একটি পরম হবে param.anything
  • /somepath/param.value.json মান সহ একটি পরম হবে param.value.json
  • ...

আপনি যদি এক্সটেনশন স্বীকৃতির যত্ন না করেন তবে আপনি mvc:annotation-drivenস্বয়ংচালিত ওভাররাইড করে এটি অক্ষম করতে পারেন :

<bean id="handlerMapping"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
    <property name="useSuffixPatternMatch" value="false"/>
</bean>

সুতরাং, আবার, যদি আপনি /somepath/{variable}:

  • /somepath/param, /somepath/param.json, /somepath/param.xmlবা /somepath/param.anythingমান সহ কোনো PARAM পরিণাম ডেকে আনবেparam
  • /somepath/param.value.json, /somepath/param.value.xmlবা /somepath/param.value.anythingমান সহ একটি পরম ফলাফলparam.value

দ্রষ্টব্য: ডিফল্ট কনফিগারেশন থেকে পার্থক্য কেবলমাত্র আপনার কাছে ম্যাপিংয়ের মতো থাকলেই দৃশ্যমান somepath/something.{variable}। দেখতে Resthub প্রকল্পের ইস্যু

যদি আপনি এক্সটেনশন ম্যানেজমেন্ট রাখতে চান তবে বসন্ত ৩.২ থেকে আপনি প্রত্যয়প্যাটার্নের স্বীকৃতি সক্রিয় রাখতে তবে নিবন্ধিত এক্সটেনশনের মধ্যে সীমাবদ্ধ রাখতে অনুরোধম্যাপিংহ্যান্ডলারম্যাপিং শিমের রেকর্ডার্ডসফিক্সপ্যাটারন ম্যাচ সম্পত্তিটিও সেট করতে পারেন।

এখানে আপনি কেবল জেসন এবং এক্সএমএল এক্সটেনশানগুলি সংজ্ঞায়িত করেছেন:

<bean id="handlerMapping"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
    <property name="useRegisteredSuffixPatternMatch" value="true"/>
</bean>

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false"/>
    <property name="favorParameter" value="true"/>
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

নোট করুন যে এমভিসি: টিকাটি চালিত এখন একটি কাস্টম শিম সরবরাহ করার জন্য একটি বিষয়বহির্ভূত বিকল্প গ্রহণ করে তবে অনুরোধম্যাপিংহ্যান্ডলারম্যাপিংয়ের সম্পত্তিটি সত্য (ডিফল্ট মিথ্যা) হিসাবে পরিবর্তন করতে হবে (সিএফ। Https://jira.springsource.org/browse/SPR-7632 )।

যে কারণে, আপনাকে এখনও সমস্ত এমভিসি: টিকা-চালিত কনফিগারেশন ওভাররাইড করতে হবে। আমি একটি কাস্টম অনুরোধম্যাপিংহ্যান্ডলারম্যাপিং: https://jira.springsource.org/browse/SPR-11253 জিজ্ঞাসা করার জন্য স্প্রিংয়ে একটি টিকিট খুললাম । আপনি যদি আগ্রহী হন তবে দয়া করে ভোট দিন।

ওভাররাইড করার সময়, কাস্টম এক্সিকিউশন ম্যানেজমেন্ট ওভাররাইড বিবেচনা করার জন্য যত্নবান হন। অন্যথায়, আপনার সমস্ত কাস্টম ব্যতিক্রম ম্যাপিং ব্যর্থ হবে। আপনাকে একটি তালিকা বিন সহ বার্তাপ্রসূচকদের পুনরায় ব্যবহার করতে হবে:

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

<util:list id="messageConverters">
    <bean class="your.custom.message.converter.IfAny"></bean>
    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean>
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</util:list>

<bean name="exceptionHandlerExceptionResolver"
      class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
    <property name="order" value="0"/>
    <property name="messageConverters" ref="messageConverters"/>
</bean>

<bean name="handlerAdapter"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
            <property name="conversionService" ref="conversionService" />
            <property name="validator" ref="validator" />
        </bean>
    </property>
    <property name="messageConverters" ref="messageConverters"/>
</bean>

<bean id="handlerMapping"
      class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
</bean>

আমি বাস্তবায়িত হয়েছি, ওপেন সোর্স প্রকল্পে রিসথুব আমি যার অংশ, এই বিষয়গুলির জন্য পরীক্ষার একটি সেট: https://github.com/resthub/resthub-spring-stack/pull/219/files এবং https: // দেখুন github.com/resthub/resthub-spring-stack/issues/217


আমাকে ক্ষমা করুন আমি একজন শিক্ষানবিস, সুতরাং আপনি বিন বিন্যাস কোথায় রাখবেন? এবং এটি কোন বসন্ত সংস্করণে প্রযোজ্য?
স্প্ল্যাশ

@ স্প্ল্যাশ: আপনার অবশ্যই এই মটরশুটিগুলি আপনার "স্ট্যান্ডার্ড" স্প্রিং অ্যাপ্লিকেশন কনটেক্সট.এক্সএমএল ফাইল (গুলি) এ সংজ্ঞায়িত করতে হবে। এটি কমপক্ষে স্প্রিংয়ের ৩.২ এ প্রযোজ্য। সম্ভবত (অন্তত আংশিক) আগে
বেমুরেন্ট

এটি আমার মতে সঠিক উত্তর নয়। দেখে মনে হচ্ছে ওপিএস সমস্যার জন্য প্যারামিটারটি "ইউজ-রেজিস্টার্ডসফিক্সপ্যাটার্নম্যাচ" হুবহু চালু করা হয়েছিল।
lrxw

এটি আমার পক্ষে সমাধানের অর্ধেক ছিল। @ পল অ্যারারের উত্তর দেখুন।
বিটজুনকি

96

স্প্রিং 4 এর জন্য আপডেট: ৪.০.১ থেকে আপনি PathMatchConfigurer(আপনার মাধ্যমে WebMvcConfigurer) যেমন ব্যবহার করতে পারেন

@Configuration
protected static class AllResources extends WebMvcConfigurerAdapter {

    @Override
    public void configurePathMatch(PathMatchConfigurer matcher) {
        matcher.setUseRegisteredSuffixPatternMatch(true);
    }

}


@Configuration
public class WebConfig implements WebMvcConfigurer {

   @Override
   public void configurePathMatch(PathMatchConfigurer configurer) {
       configurer.setUseSuffixPatternMatch(false);
   }
}

এক্সএমএল এ এটি হবে ( https://jira.spring.io/browse/SPR-10163 ):

<mvc:annotation-driven>
    [...]
    <mvc:path-matching registered-suffixes-only="true"/>
</mvc:annotation-driven>

11
এটি এখন পর্যন্ত সবচেয়ে পরিষ্কার সমাধান: এর চারপাশে হ্যাকিংয়ের পরিবর্তে এটির কারণটি বৈশিষ্ট্যটি বন্ধ করুন। আমরা যাইহোক এই বৈশিষ্ট্যটি ব্যবহার করছি না, সুতরাং সমস্যার সমাধান - নিখুঁত!
ডেভিড ল্যাভেন্ডার

অল রিসোর্স ক্লাস কোথায় যায়?
irl_irl

1
@ স্টে_র্লাল আপনার প্রধান হিসাবে একই প্যাকেজে একটি জাভা ক্লাস যুক্ত করুন।
কমেন্ট করুন

5
matcher.setUseSuffixPatternMatch(false)প্রত্যয় ম্যাচটি সম্পূর্ণ অক্ষম করতে ব্যবহার করুন ।
জিয়ান মার্কো ঘেরার্ডি

এটি আমার পক্ষে সমাধানের অর্ধেক ছিল। @ পল অ্যারারের উত্তর দেখুন।
বিটজুনকি

87

মার্টিন ফ্রেয়ের উত্তর ছাড়াও, অনুরোধম্যাপিং মানটিতে একটি পিছনে স্ল্যাশ যুক্ত করে এটিও ঠিক করা যেতে পারে:

/path/{variable}/

মনে রাখবেন যে এই ফিক্সটি রক্ষণাবেক্ষণযোগ্যতা সমর্থন করে না। এটির জন্য এখন সমস্ত ইউআরআইয়ের একটি অনুসরণীয় স্ল্যাশ থাকা দরকার - এমন কিছু যা এপিআই ব্যবহারকারী / নতুন বিকাশকারীদের কাছে দৃশ্যমান নাও হতে পারে। এটি সম্ভবত সমস্ত পরামিতিগুলির মধ্যে নাও থাকতে পারে ., এটি বিরতিযুক্ত বাগগুলিও তৈরি করতে পারে


2
এমনকি একটি ক্লিনার সমাধান। প্রত্যয় অনুসারে আইই হ'ল হেডারগুলি গ্রহণ করার জন্য যে কঠিন উপায়ে সেট করছেন সেটি আমাকে খুঁজে বের করতে হয়েছিল। তাই আমি কিছু .ডোক অনুরোধ ম্যাপিংয়ে পোস্ট করতে চেয়েছিলাম এবং আমি সবসময় নতুন এইচটিএমএল পৃষ্ঠার পরিবর্তে একটি ডাউনলোড পেয়েছি। এই পদ্ধতির যে স্থির।
মার্টিন ফ্রে

এটি আমার পক্ষে সহজ সমাধান এবং আমার সমস্যার সমাধান; রিজেক্সএফ অনেক ক্ষেত্রে ওভারকিলের কিছুটা মনে হয়
রিকার্ডো কোসু

7
তবে এটি স্বয়ংক্রিয়ভাবে পিছনে থাকা স্ল্যাশগুলি সরিয়ে আনার জন্য অ্যাংুলারজেএসের ডিফল্ট আচরণের সাথে সংঘর্ষ হয়। এটি সর্বশেষতম কৌণিক প্রকাশে কনফিগার করা যেতে পারে তবে কী চলছে তা যদি আপনি না জানেন তবে এটি কয়েক ঘন্টার জন্য ট্র্যাক করার কিছু to
ডিস্কুল্টেন

1
@ এসডচুল্টেন এবং আপনি কেবল আমাকে ডিবাগিংয়ের কয়েক ঘন্টা বাঁচিয়েছেন, ধন্যবাদ! তবুও আপনি উত্তরে উল্লেখ করতে হবে যে এইচটিপিপি অনুরোধে অনুসরণীয় স্ল্যাশ প্রয়োজন হবে।
হফম্যান

1
এটা খুব বিপজ্জনক! আমি অবশ্যই এটিকে সুপারিশ করব না কারণ এপিআই বাস্তবায়নকারী যে কেউ এটি কমপক্ষে আশা করবে। খুব অ-রক্ষণাবেক্ষণযোগ্য।
স্পার্কস্পাইডার

32

স্প্রিং বুট রেস্ট কন্ট্রোলারে, আমি নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করে এগুলি সমাধান করেছি:

রেস্ট কন্ট্রোলার:

@GetMapping("/statusByEmail/{email:.+}/")
public String statusByEmail(@PathVariable(value = "email") String email){
  //code
}

এবং রেস্ট ক্লায়েন্ট থেকে:

Get http://mywebhook.com/statusByEmail/abc.test@gmail.com/

2
এই উত্তরটি কাজ করার জন্য একটি পিছনের স্ল্যাশের উপর নির্ভরশীল।
8bitjunkie

2
একটি কবজ মত কাজ করে (স্ল্যাশ পিছনে ছাড়াও)। ধন্যবাদ!
এফএফ

27

":। +" যোগ করার জন্য আমার পক্ষে কাজ হয়েছিল তবে আমি বাইরের কোঁকড়ানো বন্ধনীগুলি সরিয়ে না দেওয়া পর্যন্ত নয়।

মান = { "/username/{id:.+}" } না কাজ

মান = "/ ব্যবহারকারীর নাম / আইডি :.+}" কাজ করে

আশা করি আমি কাউকে সাহায্য করেছি :)


কারন কোঁকড়া বন্ধনীগুলি RegEx মূল্যায়ন করে এবং আপনার ইতিমধ্যে কিছু প্রায় রয়েছেid
বিটজুনকি

15

/somepath/{variable:.+}জাভা requestMappingট্যাগে কাজ করে ।


আমি এই উত্তরটি পছন্দ করি কারণ এটি কাজ করে না তা প্রদর্শন করে না।
জননিব

একাধিক বিন্দু সহ ইমেল ঠিকানাগুলির জন্য কাজ করে না।
বিটজুনকি

1
@ 8 বিটজুঙ্কি স্টেথ "/{code:.+}"একটি বিন্দুতে নয় এমন অনেকগুলি বিন্দুতে কাজ করে যেমন 61.12.7এটি কাজ করেওk.a.p@o.i.n
করছেহার্ড

13

নিখুঁতভাবে জাভা কনফিগারেশনের উপর নির্ভর করে এমন একটি পদ্ধতির এখানে রয়েছে:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport{

    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
        handlerMapping.setUseSuffixPatternMatch(false);
        handlerMapping.setUseTrailingSlashMatch(false);
        return handlerMapping;
    }
}

ধন্যবাদ, আমার জন্য এটি সমাধান। এছাড়াও, এটি খুব পরিষ্কার এবং স্পষ্ট। +1
বিকাশ

11

এই সমস্যাটি নিয়ে কাজ করার একটি সহজ উপায় হ'ল একটি পিছনের স্ল্যাশ যুক্ত করা ...

উদাহরণ:

ব্যবহার:

/somepath/filename.jpg/

পরিবর্তে:

/somepath/filename.jpg

11

স্প্রিং বুটে, নিয়মিত প্রকাশটি সমস্যার মতো সমাধান করে

@GetMapping("/path/{param1:.+}")

মনে রাখবেন এটি কেবল একটি বিন্দুর জন্য কাজ করে। এটি ইমেল ঠিকানাগুলির জন্য কাজ করে না।
8bitjunkie

1
@ 8 বিটজুঙ্কি স্টেথ "/{code:.+}"একটি বিন্দুতে নয় এমন অনেকগুলি বিন্দুতে 61.12.7কাজ করে যেমন এটিও কাজ করে যেমনk.a.p@o.i.n
করছেহার্ড

1
@ 8 বিটজানকি আইপি ঠিকানার সাথে এটি পরীক্ষা করেছি। এটি খুব ভাল কাজ করে। সুতরাং, এর অর্থ এটি একাধিক বিন্দুর জন্য কাজ করে।
ড্যাপার ড্যান

6

বসন্ত ৪.২ এর পথের নামগুলির ইমেল ঠিকানাগুলি সহ সম্পূর্ণ সমাধান

<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false" />
    <property name="favorParameter" value="true" />
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>
<mvc:annotation-driven
    content-negotiation-manager="contentNegotiationManager">
    <mvc:path-matching suffix-pattern="false" registered-suffixes-only="true" />
</mvc:annotation-driven>

এটিকে অ্যাপ্লিকেশন-এক্সএমএলে যুক্ত করুন


আপভোট - এখানে একমাত্র উত্তর যা এই বিষয়টিকে
বিটজুনকি

5

আপনি যদি স্প্রিং ৩.২.x ব্যবহার করছেন এবং এটি <mvc:annotation-driven />তৈরি করুন BeanPostProcessor:

package spring;

public final class DoNotTruncateMyUrls implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof RequestMappingHandlerMapping) {
            ((RequestMappingHandlerMapping)bean).setUseSuffixPatternMatch(false);
        }
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

তারপরে এটি আপনার এমভিসি কনফিগারেশন xML এ রাখুন:

<bean class="spring.DoNotTruncateMyUrls" />

এটি কি কন্টেন্টনিগোটিয়েশন ম্যানেজারের সাথে সম্পর্কিত?
কানাগাভেলু সুগুমার

আমার কোডটি শুধুমাত্র অনুরোধম্যাপিংহ্যান্ডলারম্যাপিংটি কনফিগার করে যাতে URL গুলি কেটে যাবে না। কন্টেন্টনিগোটিয়েশন ম্যানেজার হ'ল আরেকটি জন্তু।
Jukka

2
এটি পুরানো, তবে এর জন্য আপনার সত্যিই দরকার নেই BeanPostProcessor। আপনি যদি ব্যবহার করেন তবে আপনি পদ্ধতিটি WebMvcConfigurationSupportওভাররাইড করতে পারেন requestMappingHandlerMapping @Bean। আপনি যদি এক্সএমএল কনফিগারেশন ব্যবহার করেন তবে আপনি কেবল নিজের RequestMappingHandlerMappingশিম ঘোষণা করতে পারেন এবং সেই সম্পত্তিটি ঘোষণা করতে পারেন।
সোটিরিওস ডেলিমনলিস

আপনাকে অনেক ধন্যবাদ, আমি একই সমস্যার জন্য বিভিন্ন সংখ্যক সমাধানের চেষ্টা করেছি, কেবল এই আমার জন্য কাজ করেছিল। :-)
আমরা

3

শেষ পর্যন্ত আমি স্প্রিং ডক্সে সমাধান পেয়েছি :

ফাইল এক্সটেনশানগুলির ব্যবহার সম্পূর্ণরূপে অক্ষম করতে, আপনাকে নিম্নলিখিত দুটি অবশ্যই সেট করতে হবে:

 useSuffixPatternMatching(false), see PathMatchConfigurer

 favorPathExtension(false), see ContentNegotiationConfigurer

এটি আমার WebMvcConfigurerAdapterবাস্তবায়নে যুক্ত করা সমস্যার সমাধান করেছে:

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false);
}

@Override
public void configurePathMatch(PathMatchConfigurer matcher) {
    matcher.setUseSuffixPatternMatch(false);
}

2

আমার জন্য

@GetMapping(path = "/a/{variableName:.+}")

কাজ করে তবে কেবল যদি আপনি আপনার অনুরোধ url এ "" ডট "কে"% 2E "হিসাবে এনকোড করেন তবে এটি কার্যকর হয়। তবে ইউআরএলটির সবথেকে অবশ্যই প্রয়োজন ... যা বৈধ হলেও "মানক" এনকোডিং নয়। কোনও বাগের মতো মনে হচ্ছে: |

চারপাশের অন্যান্য কাজগুলি, "ট্রেলিং স্ল্যাশ" পদ্ধতির অনুরূপ, ভেরিয়েবলটি সরানো যা ডট "ইনলাইন" প্রাক্তন থাকবে:

@ গেটম্যাপিং (পথ = "/ {ভেরিয়েবলনেম} / একটি")

এখন সমস্ত বিন্দু সংরক্ষণ করা হবে, কোন পরিবর্তন বা রেজেক্সের প্রয়োজন নেই।


1

স্প্রিং 5.2.4 (স্প্রিং বুট v2.2.6.RELEASE) হিসাবে PathMatchConfigurer.setUseSuffixPatternMatchএবং অবমুক্ত ContentNegotiationConfigurer.favorPathExtensionকরা হয়েছে ( https://spring.io/blog/2020/03/24/spring-framework-5-2-5- উপলভ্য- এখন এবং https://github.com/spring-projects/spring-framework/issues/24179 )।

আসল সমস্যাটি হ'ল ক্লায়েন্ট একটি নির্দিষ্ট মিডিয়া টাইপের অনুরোধ করে (যেমন .কম) এবং স্প্রিং সেই সমস্ত মিডিয়া প্রকারকে ডিফল্টরূপে যুক্ত করে। বেশিরভাগ ক্ষেত্রে আপনার REST নিয়ামকটি কেবল JSON উত্পাদন করে তাই এটি অনুরোধ করা আউটপুট ফর্ম্যাট (.কম) সমর্থন করবে না। এই সমস্যাটি কাটিয়ে ওঠার জন্য আপনার 'আউটপুট' ফর্ম্যাটটি ( @RequestMapping(produces = MediaType.ALL_VALUE) সমর্থন করার জন্য আপনার রেস্ট কন্ট্রোলার (বা নির্দিষ্ট পদ্ধতি) আপডেট করে অবশ্যই ভাল হওয়া উচিত এবং অবশ্যই বিন্দুর মতো অক্ষরকে অনুমতি দিন ({username:.+} ) এর ।

উদাহরণ:

@RequestMapping(value = USERNAME, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public class UsernameAPI {

    private final UsernameService service;

    @GetMapping(value = "/{username:.+}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.ALL_VALUE)
    public ResponseEntity isUsernameAlreadyInUse(@PathVariable(value = "username") @Valid @Size(max = 255) String username) {
        log.debug("Check if username already exists");
        if (service.doesUsernameExist(username)) {
            return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
        }
        return ResponseEntity.notFound().build();
    }
}

বসন্ত 5.3 এবং উপরের কেবলমাত্র নিবন্ধিত প্রত্যয় (মিডিয়া প্রকারের) সাথে মিলবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.