दिलचस्प पोस्ट
इकाई फ़्रेमवर्क मेटाडेटा से डाटाबेस तालिका नाम प्राप्त करें एसक्यूएल नहीं काम नहीं कर रहा है NSURL सत्र के माध्यम से पोस्ट अनुरोध भेजें Asp.net mvc में नियंत्रक को सरल अजाक्स कॉल करना आईओएस पर इंटरनेट कनेक्शन का पता लगाने का सबसे आसान तरीका है? क्या "argv = नाम-निष्पादनयोग्य" स्वीकृत मानक या सिर्फ एक आम सम्मेलन है? टॉमकेट 7.0 में वेब एप्लिकेशन का संदर्भ पथ कैसे सेट करें उद्देश्य-सी: फॉरवर्ड क्लास डिक्लेरेशन फोंट के लिए उचित माइम प्रकार जावा का उपयोग करके ईमेल भेजें कॉलम को mysql तालिका में जोड़ें यदि यह मौजूद नहीं है जावास्क्रिप्ट में समय की तुलना किए बिना तिथि के भाग की तुलना करना एक पाठ फ़ाइल में यूनिकोड पाठ लिख रहे हैं? जावास्क्रिप्ट में मैं एक आईएसओ 8601 फॉर्मैट स्ट्रिंग कैसे आउटपुट करूँ? CADisplayLink ओपनगैल रेंडरिंग ब्रेक UIScrollView व्यवहार

स्प्रिंग एमवीसी @ पाथ वारायण हो रही है

मेरे पास एक नियंत्रक है जो जानकारी के लिए रियायत पहुंच प्रदान करता है:

@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}") public ModelAndView getBlah(@PathVariable String blahName, HttpServletRequest request, HttpServletResponse response) { 

मुझे जो समस्या आ रही है वह यह है कि अगर मैं विशेष वर्णों के साथ पथ वेरिएबल के साथ सर्वर को मारा, तो यह छोटा हो जाता है। उदाहरण के लिए: http: // localhost: 8080 / blah-server / blah / get / blah2010.08.19-02: 25: 47

पैरामीटर blahName blah2010.08 होगा

हालांकि, request.getRequestURI () को कॉल में पास की गई सभी जानकारी शामिल है

किसी भी विचार से स्प्रिंग को @ पाथ वैरिएबल से अलग करने के लिए कैसे रोकें?

वेब के समाधान से एकत्रित समाधान "स्प्रिंग एमवीसी @ पाथ वारायण हो रही है"

@RequestMapping तर्क के लिए एक नियमित अभिव्यक्ति की कोशिश करें:

 RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName:.+}") 

यह संभवतः एसपीआर -6164 से निकटता से संबंधित है संक्षेप में, ढांचा यूआरआई व्याख्या को कुछ स्मर्ट्स को लागू करने की कोशिश करता है, जो फ़ाइल एक्सटेंशन को सोचता है उसे निकालता है blah2010.08.19-02:25:47 को blah2010.08 में blah2010.08 , क्योंकि यह सोचता है। 1 9 .19-02:25:47 एक फ़ाइल एक्सटेंशन है।

लिंक किए गए मुद्दे में वर्णित के अनुसार, आप ऐप संदर्भ में अपने स्वयं के useDefaultSuffixPattern बीन को घोषित करके और इसके useDefaultSuffixPattern सेट करने के लिए useDefaultSuffixPattern संपत्ति को false useDefaultSuffixPattern इस व्यवहार को अक्षम कर सकते हैं। यह डिफ़ॉल्ट व्यवहार को ओवरराइड करेगा, और इसे आपके डेटा से छेड़छाड़ करना बंद कर देगा।

स्प्रिंग समझता है कि आखिरी डॉट के पीछे कुछ भी एक फ़ाइल एक्सटेंशन है, जैसे कि .json या .xml और इसे अपने पैरामीटर को पुनः प्राप्त करने के लिए छोडें।

इसलिए यदि आपके पास /{blahName} :

  • /param , /param.json , /param.xml या / /param.anything मान param परम के साथ परिणाम देगा
  • /param.value.json , /param.value.xml या /param.value.anything का मान param param.value साथ एक param में परिणाम होगा

यदि आप /{blahName:.+} के सुझाव के /{blahName:.+} अपना मैपिंग बदलते हैं, तो अंतिम बिंदु सहित किसी भी बिंदु को आपके पैरामीटर के भाग के रूप में माना जाएगा:

  • /param एक परम के साथ एक मूल्य param
  • /param.json मूल्य param.json परम के साथ एक परिणाम होगा
  • /param.xml मूल्य param.xml साथ एक param में परिणाम होगा
  • /param.anything मूल्य param.anything साथ एक param में परिणाम होगा
  • /param.value.json का मूल्य param.value.json साथ एक param में परिणाम होगा

यदि आप विस्तार की पहचान की परवाह नहीं करते हैं, तो आप इसे एमवसी ओवरराइड करके अक्षम कर सकते हैं 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> 

तो, फिर, अगर आपके पास /{blahName} :

  • /param , /param.json , /param.xml या / /param.anything मान param परम के साथ परिणाम देगा
  • /param.value.json , /param.value.xml या /param.value.anything का मान param param.value साथ एक param में परिणाम होगा

नोट: डिफ़ॉल्ट कॉन्फ़िग में अंतर केवल तभी दिखाई दे, जब आपके पास / /something.{blahName} जैसी मैपिंग है। /something.{blahName} । Resthub प्रोजेक्ट समस्या देखें

अगर आप एक्स्टेंशन मैनेजमेंट रखना चाहते हैं, तो स्प्रिंग 3.2 के बाद से आप प्रत्यय को बनाए रखने के लिए RequestMappingHandler मैपिंग बीन का उपयोग कर सकते हैं रजिस्ट्रस्टेडफ़िटेन्समाच प्रॉपर्टी सेट कर सकते हैं।

यहां आप केवल 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> 

नोट करें कि एमवीसी: एनोटेशन-चालित अब एक कस्टम मानदंड प्रदान करने के लिए सामग्री बातचीत विकल्प स्वीकार करता है, लेकिन RequestMappingHandlerMapping की संपत्ति को सही (डिफ़ॉल्ट झूठे) में बदलना होगा (cf. 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> 

मैंने ओपन सोर्स प्रोजेक्ट Resthub में कार्यान्वित किया है, मैं इन विषयों पर परीक्षणों का एक हिस्सा हूं: https://github.com/resthub/resthub-spring-stack/pull/219/files और https: // देखें github.com/resthub/resthub-spring-stack/issues/217

अंतिम बिंदु के बाद की सभी चीज़ों को फ़ाइल एक्सटेंशन के रूप में परिभाषित किया जाता है और डिफ़ॉल्ट रूप से कट जाता है
आपके स्प्रिंग कॉन्फिग एक्सएमएल में आप डिफॉल्ट useDefaultSuffixPattern को जोड़ सकते हैं और उपयोग useDefaultSuffixPattern को false (डिफ़ॉल्ट true ) कर सकते हैं।

इसलिए अपना स्प्रिंग एक्सएमएल mvc-config.xml खोलें (या फिर इसे कहा जाता है) और जोड़ें

 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="useDefaultSuffixPattern" value="false" /> </bean> 

अब आपके @PathVariable blahName (और अन्य सभी, में भी) सभी बिंदुओं सहित पूर्ण नाम शामिल होना चाहिए

संपादित करें: यहां वसंत एपीआई के लिए एक लिंक है

मैं भी एक ही मुद्दे में भाग गया, और झूठी संपत्ति को स्थापित करने में मेरी मदद नहीं की हालांकि, एपीआई कहते हैं :

ध्यान दें कि जिस पथ में ".xxx" प्रत्यय या अंत में "/" शामिल है, उसे किसी भी स्थिति में डिफ़ॉल्ट प्रत्यय पैटर्न का उपयोग नहीं किया जाएगा।

मैंने अपने रेंटल यूआरएल को "/ एंड" जोड़ने की कोशिश की, और समस्या दूर चली गई। मैं समाधान के साथ खुश नहीं हूँ, लेकिन यह काम किया था

बीटीडब्लू, मुझे नहीं पता कि स्प्रिंग डिजाइनर क्या सोच रहे थे जब उन्होंने "सुविधा" को जोड़ा और फिर इसे डिफ़ॉल्ट रूप से चालू कर दिया। आईएमएचओ, इसे हटाया जाना चाहिए।

सही जावा कॉन्फ़िगरेशन क्लास का उपयोग करना:

 @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.favorPathExtension(false); } @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseSuffixPatternMatch(false); } } 

मैं इस हैक द्वारा हल

1) HttpServletRequest @ PathVariable में नीचे की तरह जोड़ा गया

  @PathVariable("requestParam") String requestParam, HttpServletRequest request) throws Exception { 

2) अनुरोध में सीधे यूआरएल प्राप्त करें (इस स्तर पर कोई कटौती नहीं)

 request.getPathInfo() 

स्प्रिंग एमवीसी @ पैथ व्हेरिएबल डॉट (।) के साथ छोटा हो गया है

मैं बस इस में भाग गया और यहाँ के समाधान आम तौर पर काम नहीं करते जैसा मैं उम्मीद करता था

मैं एक स्पेल अभिव्यक्ति और एकाधिक मैपिंग का उपयोग करने का सुझाव देता हूं, उदा

 @RequestMapping(method = RequestMethod.GET, value = {Routes.BLAH_GET + "/{blahName:.+}", Routes.BLAH_GET + "/{blahName}/"}) 

फ़ाइल एक्सटेंशन समस्या केवल तभी मौजूद है यदि पैरामीटर URL के अंतिम भाग में है। परिवर्तन

 @RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}") 

सेवा मेरे

 @RequestMapping( method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}/safe") 

और सब ठीक हो जाएंगे-

यदि आप उस पते को संपादित कर सकते हैं जिसे अनुरोध भेजा जाता है, तो साधारण सुधार उनको (और @RequestMapping मान में भी) एक अनुगामी स्लैश जोड़ना होगा:

 /path/{variable}/ 

इसलिए मानचित्रण ऐसा दिखेगा:

 RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}/") 

स्प्रिंग एमवीसी @ पाथ वारायबल को डॉट (।) के साथ भी छोटा किया जा रहा है ।

 //in your xml dispatcher add this property to your default annotation mapper bean as follow <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> <property name="alwaysUseFullPath" value="true"></property> </bean> 

"।:" को जोड़ने के लिए मेरे लिए काम किया, लेकिन जब तक मैं बाहरी घुंघराले कोष्ठक

value = {"/username/{id:.+}"} काम नहीं किया

value = "/username/{id:.+}" काम करता है

आशा है कि मैंने किसी को मदद की:]

ट्रंकसेशन को रोकने के लिए जावा आधारित कॉन्फ़िगरेशन समाधान (गैर-बहिष्कृत वर्ग का उपयोग करके):

 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 PolRepWebConfig extends WebMvcConfigurationSupport { @Override @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { final RequestMappingHandlerMapping handlerMapping = super .requestMappingHandlerMapping(); // disable the truncation after . handlerMapping.setUseSuffixPatternMatch(false); // disable the truncation after ; handlerMapping.setRemoveSemicolonContent(false); return handlerMapping; } } 

स्रोत: http://www.javacodegeeks.com/2013/01/spring-mvc-customizing-requestmappinghandlermping.html

अद्यतन करें:

मुझे स्प्रिंग बूट ऑटो कॉन्फ़िगरेशन के साथ कुछ समस्याओं का एहसास हुआ जब मैंने ऊपर दिए गए दृष्टिकोण का उपयोग किया (कुछ ऑटो कॉन्फ़िगरेशन प्रभावी नहीं हो)

इसके बजाय, मैं BeanPostProcessor दृष्टिकोण का उपयोग करना शुरू कर दिया यह बेहतर काम करने लग रहा था

 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { private static final Logger logger = LoggerFactory .getLogger(MyBeanPostProcessor.class); @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof RequestMappingHandlerMapping) { setRemoveSemicolonContent((RequestMappingHandlerMapping) bean, beanName); setUseSuffixPatternMatch((RequestMappingHandlerMapping) bean, beanName); } return bean; } private void setRemoveSemicolonContent( RequestMappingHandlerMapping requestMappingHandlerMapping, String beanName) { logger.info( "Setting 'RemoveSemicolonContent' on 'RequestMappingHandlerMapping'-bean to false. Bean name: {}", beanName); requestMappingHandlerMapping.setRemoveSemicolonContent(false); } private void setUseSuffixPatternMatch( RequestMappingHandlerMapping requestMappingHandlerMapping, String beanName) { logger.info( "Setting 'UseSuffixPatternMatch' on 'RequestMappingHandlerMapping'-bean to false. Bean name: {}", beanName); requestMappingHandlerMapping.setUseSuffixPatternMatch(false); } } 

से प्रेरित: http://ronaldxq.blogspot.com/2014/10/spring-mvc-setting-alwaysusefullpath-on.html

यदि आप सुनिश्चित हैं कि आपका पाठ किसी भी डिफ़ॉल्ट एक्सटेंशन से मेल नहीं खाएगा, तो आप नीचे कोड का उपयोग कर सकते हैं:

 @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void configurePathMatch(PathMatchConfigurer configurer) { configurer.setUseRegisteredSuffixPatternMatch(true); } } 

ट्रांस्काटेड होने के लिए स्प्रिंग एमवीसी @ पाथ-व्हेरेबल को रोकने के लिए मेरा बेहतर समाधान पथ वैरिएबल के अंत में अनुगामी स्लैश जोड़ना है।

उदाहरण के लिए:

 @RequestMapping(value ="/email/{email}/") 

इसलिए, अनुरोध ऐसा दिखेगा:

 http://localhost:8080/api/email/test@test.com/