spring - يتم الحصول على قطع MVCPathVariable مع نقطة(.)




rest spring-mvc (8)

هذا استمرار للسؤال MVC الربيع @ PathVariable الحصول على اقتطاع

يوضح منتدى الربيع أنه قد تم إصلاحه (الإصدار 3.2) كجزء من ContentNegotiationManager. انظر الرابط أدناه.
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632

في طلب الطلب الخاص بي ، يتم اقتطاع Parameter مع com.

هل يمكن لأي أحد أن يشرح لي كيفية استخدام هذه الميزة الجديدة؟ كيف هو شكلي في XML؟

ملاحظة: spring forum- # 1 Spring MVCPathVariable with dot (.) يتم اقتطاعها


إذا كنت تستخدم Spring 3.2.x و <mvc:annotation-driven /> ، BeanPostProcessor بإنشاء هذا 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;
    }
}

ثم ضع هذا في XV config MVC الخاص بك:

<bean class="spring.DoNotTruncateMyUrls" />

الحل الكامل بما في ذلك عناوين البريد الإلكتروني في أسماء المسارات لربيع 4.2 هو

<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>

أضف هذا إلى تطبيق xml


بقدر ما أعرف تظهر هذه المشكلة فقط من أجل pathvariable في نهاية requestmapping.

تمكنا من حل ذلك عن طريق تحديد الملحق المعتاد في requestmapping.

 /somepath/{variable:.+}

تحديث لـ Spring 4: منذ الإصدار 4.0.1 ، يمكنك استخدام PathMatchConfigurer (عبر WebMvcConfigurer ) ، على سبيل المثال

@Configuration
protected static class AllResources extends WebMvcConfigurerAdapter {

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

}

في xml ، سيكون ( https://jira.spring.io/browse/SPR-10163 ):

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

في Spring Boot ، يحل التعبير العادي مشكلة مثل

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

في وحدة تحكم Spring Boot Rest ، قمت بحل هذه الخطوات باتباع الخطوات التالية:

RestController:

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

ومن راحة العميل:

Get http://mywebhook.com/statusByEmail/[email protected]/

وهنا نهج يعتمد بحتة على تكوين جافا:

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;
    }
}

يعتبر Spring أن أي شيء خلف آخر نقطة هو امتداد الملف مثل .json أو .xml ويرسمه لاسترداد المعلمة.

إذا كان لديك /somepath/{variable} :

  • /somepath/param ، /somepath/param.json ، /somepath/param.xml أو /somepath/param.anything سيؤدي إلى معلمة ذات param قيمة
  • /somepath/param.value.json ، /somepath/param.value.xml أو /somepath/param.value.anything سيؤدي إلى معلمة ذات قيمة param.value

إذا قمت بتغيير التعيين إلى /somepath/{variable:.+} كما هو مقترح ، /somepath/{variable:.+} أي نقطة ، بما في ذلك النقطة الأخيرة جزءًا من المعلمة:

  • /somepath/param سيؤدي إلى param مع param value
  • /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 automagic المستند 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 قيمة
  • /somepath/param.value.json ، /somepath/param.value.xml أو /somepath/param.value.anything سيؤدي إلى معلمة ذات قيمة param.value

ملاحظة: يكون الفرق من التهيئة الافتراضية مرئيًا فقط إذا كان لديك تخطيط مثل somepath/something.{variable} . انظر قضية مشروع Resthub

إذا كنت ترغب في الاحتفاظ بإدارة الامتداد ، منذ ربيع 3.2 ، يمكنك أيضًا تعيين خاصية UseRegisteredSuffixPatternMatch الخاصة بحقل RequestMappingHandlerMapping من أجل الاحتفاظ بالاعتراف بعيدًا ، ولكن يتم تقييد الامتداد المسجل.

هنا يمكنك تحديد ملحقات json و xml فقط:

<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>

لاحظ أن mvc: التعليق المعتمد على التعليقات يقبل الآن خيار contentNegotiation لتوفير حبة مخصصة ولكن يجب تغيير خاصية RequestMappingHandlerMapping إلى true (false false) (راجع https://jira.springsource.org/browse/SPR-7632 ).

ولهذا السبب ، لا يزال يتعين عليك تجاوز جميع mvc: التهيئة المستندة إلى التعليقات التوضيحية. لقد فتحت تذكرة لربيع الربيع لطلب الحصول على CustomMappingHandlerMapping مخصص: https://jira.springsource.org/browse/SPR-11253 . يرجى التصويت إذا كنت متواجدا فيها.

في حين تجاوز ، كن حريصا على النظر أيضا تجاوز إدارة التنفيذ مخصص. وإلا ، فستفشل جميع التعيينات المخصصة للإعفاءات. سيكون عليك إعادة استخدام messageCoverters بقائمة حبة:

<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>

قمت بتطبيق ، في مشروع المصدر المفتوح Resthub الذي أنا جزء منه ، مجموعة من الاختبارات على هذه الموضوعات: انظر https://github.com/resthub/resthub-spring-stack/pull/219/files & https: // github.com/resthub/resthub-spring-stack/issues/217





spring-annotations