Spring MVC @PathVariable ที่มีจุด (.) กำลังถูกตัดทอน


361

นี่คือความต่อเนื่องของคำถาม Spring MVC @PathVariable ที่ถูกตัดทอน

ฟอรัม Spring ระบุว่ามีการแก้ไข (เวอร์ชัน 3.2) เป็นส่วนหนึ่งของ ContentNegotiationManager ดูลิงค์ด้านล่าง
https://jira.springsource.org/browse/SPR-6164
https://jira.springsource.org/browse/SPR-7632

ในแอปพลิเคชันของฉัน requestParameter ที่มี. com จะถูกปัดเศษ

ใครช่วยอธิบายวิธีใช้คุณสมบัติใหม่นี้ให้ฉันได้บ้าง สามารถกำหนดค่าได้อย่างไรที่ xml

หมายเหตุ: spring forum- # 1 Spring MVC @PathVariable ที่มีจุด (.) กำลังถูกตัดทอน

คำตอบ:


485

เท่าที่ฉันรู้ปัญหานี้จะปรากฏเฉพาะสำหรับ pathvariable ในตอนท้ายของการร้องขอการทำแผนที่

เราสามารถแก้ปัญหานั้นได้โดยการกำหนด regex addon ใน requestmapping

 /somepath/{variable:.+}

1
ขอบคุณฉันคิดว่าการแก้ไขนี้ใช้ได้ก่อนหน้านี้ด้วย (ก่อนหน้า 3.2V) อย่างไรก็ตามฉันไม่ชอบการแก้ไขนี้ เนื่องจากมันเป็นสิ่งจำเป็นที่ url ทั้งหมดที่จะต้องมีการจัดการในใบสมัครของฉัน ... และการใช้ URL ในอนาคตก็จะได้รับการดูแลเรื่องนี้ ...
Kanagavelu Sugumar

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

11
@Mariusz ไวยากรณ์คือ{variable_name:regular_expression}ดังนั้นที่นี่เรามีชื่อตัวแปรvariableซึ่งค่าจะถูกจับคู่โดยใช้ regex .+(ที่.หมายถึง 'ตัวละครใด ๆ ' และ+หมายถึง 'หนึ่งครั้งหรือมากกว่า')
Michał Rybak

4
@StefanHaberl หากคุณจับคู่กันvariableตามปกติสปริงใช้คุณสมบัติการตรวจสอบคำต่อท้ายและตัดทุกอย่างหลังจากจุด เมื่อคุณใช้การจับคู่ regexp คุณลักษณะเหล่านั้นจะไม่ถูกใช้ - ตัวแปรจะถูกจับคู่กับ regexp ที่คุณระบุเท่านั้น
Michał Rybak

9
@martin "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
  • /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-drivenautomagic:

<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

ถ้าคุณต้องการเก็บการจัดการส่วนขยายไว้ตั้งแต่ Spring 3.2 คุณสามารถตั้งค่าคุณสมบัติ useRegisteredSuffixPatternMatch ของ RequestMappingHandlerMapping bean เพื่อให้การรับรู้ suffixPattern เปิดใช้งาน แต่ จำกัด เฉพาะส่วนขยายที่ลงทะเบียนไว้

ที่นี่คุณกำหนดเฉพาะส่วนขยาย 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 จะต้องเปลี่ยนเป็นจริง (เท็จเริ่มต้น) (cf https://jira.springsource.org/browse/SPR-7632 )

ด้วยเหตุผลดังกล่าวคุณยังคงต้องแทนที่การกำหนดค่าที่ขับเคลื่อนด้วยคำอธิบายประกอบ mvc ทั้งหมด ฉันเปิดตั๋วไป Spring เพื่อขอ RequestMappingHandlerMapping ที่กำหนดเอง: https://jira.springsource.org/browse/SPR-11253 โปรดลงคะแนนถ้าคุณถูกขัดจังหวะ

ในขณะที่การเอาชนะโปรดระมัดระวังในการพิจารณาการจัดการ Execution แบบกำหนดเองด้วย มิฉะนั้นการแมปข้อยกเว้นที่กำหนดเองทั้งหมดของคุณจะล้มเหลว คุณจะต้องใช้ messageCoverters ใหม่ด้วย list bean:

<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 project แบบโอเพนซอร์สที่ฉันเป็นส่วนหนึ่งของชุดการทดสอบในหัวข้อเหล่านี้: ดูhttps://github.com/resthub/resthub-spring-stack/pull/219/files & https: // github.com/resthub/resthub-spring-stack/issues/217


ยกโทษให้ฉันฉันเป็นสามเณรคุณจะวางถั่วไว้ที่ไหน? และเวอร์ชั่นสปริงใช้กับอะไร?
สแปลช

@Splash: คุณต้องกำหนด beans เหล่านี้ลงในไฟล์ "มาตรฐาน" Spring applicationContext.xml สิ่งนี้ใช้กับ Spring 3.2 อย่างน้อย อาจเป็น (อย่างน้อยบางส่วน) ก่อน
bmeurant

นี่คือคำตอบที่ถูกต้องในความคิดของฉัน ดูเหมือนว่าพารามิเตอร์ "useRegisteredSuffixPatternMatch" ถูกนำมาใช้อย่างแม่นยำสำหรับปัญหา OPs
lrxw

นี่เป็นวิธีแก้ปัญหาเพียงครึ่งเดียวสำหรับฉัน ดูคำตอบของ @Paul Aerer
8bitjunkie

96

อัปเดตสำหรับ Spring 4: ตั้งแต่ 4.0.1 คุณสามารถใช้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);
   }
}

ใน xml จะเป็น ( https://jira.spring.io/browse/SPR-10163 ):

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

11
นี่เป็นวิธีการแก้ไขที่สะอาดที่สุด: ปิดคุณลักษณะที่ทำให้เกิดปัญหาแทนที่จะแฮ็คข้อมูล เราไม่ได้ใช้คุณสมบัตินี้อยู่ดังนั้นแก้ไขปัญหาได้แล้ว - สมบูรณ์แบบ!
David Lavender

คลาส AllResources ไปที่ใด
irl_irl

1
@ste_irl เพิ่มคลาส java ในแพ็คเกจเดียวกับ main ของคุณ
kometen

5
ใช้matcher.setUseSuffixPatternMatch(false)เพื่อปิดการจับคู่คำต่อท้ายโดยสมบูรณ์
Gian Marco Gherardi

นี่เป็นวิธีแก้ปัญหาเพียงครึ่งเดียวสำหรับฉัน ดูคำตอบของ @Paul Aerer
8bitjunkie

87

นอกจากคำตอบของ Martin Frey สิ่งนี้สามารถแก้ไขได้โดยการเพิ่มเครื่องหมายสแลชต่อท้ายในค่า RequestMapping:

/path/{variable}/

โปรดทราบว่าการแก้ไขนี้ไม่สนับสนุนการบำรุงรักษา ตอนนี้ต้องการให้ URI ทั้งหมดมีเครื่องหมายสแลชต่อท้ายซึ่งเป็นสิ่งที่อาจไม่ชัดเจนสำหรับผู้ใช้ API / นักพัฒนาใหม่ เนื่องจากอาจเป็นไปได้ว่าพารามิเตอร์ทั้งหมดอาจไม่มี a .อยู่ในนั้นจึงอาจสร้างข้อบกพร่องเป็นระยะ


2
นั่นเป็นวิธีที่สะอาดกว่า ฉันต้องหาวิธีที่ยากที่ IE ตั้งค่าให้ยอมรับส่วนหัวตามส่วนต่อท้าย ดังนั้นฉันต้องการที่จะโพสต์ในการร้องขอการแมป. doc และฉันมักจะดาวน์โหลดแทนที่จะเป็นหน้า html ใหม่ วิธีนี้แก้ไขได้ที่
Martin Frey

นี่เป็นทางออกที่ง่ายที่สุดสำหรับฉันในการแก้ไขปัญหาของฉัน regexp ดูเหมือนบิตของ overkill สำหรับหลาย ๆ กรณี
Riccardo Cossu

7
แต่มันขัดแย้งกับพฤติกรรมเริ่มต้นของ AngularJS เพื่อลบเครื่องหมายสแลชต่อท้ายโดยอัตโนมัติ ที่สามารถกำหนดค่าในรุ่นล่าสุดของ Angular แต่เป็นสิ่งที่ต้องติดตามเป็นเวลาหลายชั่วโมงหากคุณไม่รู้ว่าเกิดอะไรขึ้น
dschulten

1
@dschulten และคุณช่วยฉันแก้จุดบกพร่องหลายชั่วโมงแล้วขอบคุณ! อย่างไรก็ตามคุณควรพูดถึงในคำตอบว่าต้องใช้เครื่องหมายทับต่อท้ายในคำขอ HTPP
Hoffmann

1
มันอันตรายมาก! แน่นอนว่าฉันจะไม่แนะนำเพราะคนที่ใช้งาน API จะคาดหวังได้น้อยที่สุด ไม่บำรุงรักษามาก
sparkyspider

32

ใน Spring Boot Rest Controller ฉันได้แก้ไขสิ่งเหล่านี้โดยทำตามขั้นตอน:

RestController:

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

และจากลูกค้าที่เหลือ:

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

2
คำตอบนี้ขึ้นอยู่กับเครื่องหมายสแลชเพื่อทำงาน
8bitjunkie

2
ทำงานเหมือนมีเสน่ห์ (เช่นไม่มีสแลชต่อท้าย) ขอบคุณ!
afe

27

การเพิ่ม ":. +" ใช้งานได้สำหรับฉัน แต่ไม่ได้จนกว่าฉันจะลบวงเล็บปีกกาด้านนอกออก

value = { "/username/{id:.+}" } ไม่ทำงาน

value = "/username/{id:.+}" ทำงาน

หวังว่าฉันช่วยใครบางคน :)


นั่นเป็นเพราะวงเล็บปีกกาประเมิน RegEx และคุณมีอยู่แล้วid
8bitjunkie

15

/somepath/{variable:.+}ทำงานในrequestMappingแท็กJava


ฉันชอบคำตอบนี้เพราะมันไม่แสดงว่าอะไรไม่ทำงาน
johnnieb

ใช้งานไม่ได้กับที่อยู่อีเมลที่มีจุดมากกว่าหนึ่งจุด
8bitjunkie

1
@ 8bitjunkie Sth ชอบ"/{code:.+}"ผลงานสำหรับหลาย ๆ จุดไม่ใช่เช่น61.12.7นั้นมันยังใช้งานได้เช่นk.a.p@o.i.n
tryHard

13

นี่คือวิธีการที่ต้องอาศัยการกำหนดค่า java อย่างแท้จริง:

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
bkis

11

วิธีการง่ายๆในการแก้ไขปัญหานี้คือการต่อท้ายสแลชต่อท้าย ...

เช่น:

ใช้:

/somepath/filename.jpg/

แทน:

/somepath/filename.jpg

11

ใน Spring Boot นิพจน์ปกติแก้ปัญหาเช่น

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

โปรดทราบว่าสิ่งนี้ใช้ได้กับหนึ่งจุดเท่านั้น ใช้ไม่ได้กับที่อยู่อีเมล
8bitjunkie

1
@ 8bitjunkie Sth ชอบ"/{code:.+}"ผลงานสำหรับหลาย ๆ จุดไม่ใช่เช่น61.12.7นั้นมันยังใช้งานได้เช่นk.a.p@o.i.n
tryHard

1
@ 8bitjunkie ฉันได้ทดสอบด้วยที่อยู่ IP มันใช้งานได้ดีมาก นั่นหมายความว่ามันใช้งานได้กับหลายจุด
Dapper Dan

6

โซลูชันที่สมบูรณ์รวมถึงที่อยู่อีเมลในชื่อพา ธ สำหรับฤดูใบไม้ผลิ 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>

เพิ่มไปยัง application-xml


Upvote - นี่เป็นคำตอบเดียวที่นี่ซึ่งทำให้ชัดเจนว่าทั้ง ContentNegotiationManagerFactoryBean และ contentNegotiationManager ต้องการรายการการตั้งค่า
8bitjunkie

5

หากคุณใช้ Spring 3.2.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;
    }
}

จากนั้นใส่สิ่งนี้ลงใน MVC config xml ของคุณ:

<bean class="spring.DoNotTruncateMyUrls" />

เกี่ยวข้องกับ ContentNegotiationManager หรือไม่
Kanagavelu Sugumar

รหัสของฉันกำหนดค่า RequestMappingHandlerMapping เท่านั้นเพื่อที่ URL จะไม่ถูกตัดทอน ContentNegotiationManager เป็นสัตว์ร้ายอีกตัวหนึ่ง
Jukka

2
นี่เป็นรุ่นเก่า แต่คุณไม่ต้องการสิ่งBeanPostProcessorนี้ หากคุณใช้WebMvcConfigurationSupportคุณสามารถแทนที่requestMappingHandlerMapping @Beanวิธีการ หากคุณใช้การกำหนดค่า XML คุณสามารถประกาศRequestMappingHandlerMappingbean ของคุณเองและประกาศคุณสมบัตินั้นได้
Sotirios Delimanolis

ขอบคุณมากฉันลองใช้วิธีแก้ไขปัญหาที่แตกต่างกันสำหรับปัญหาเดียวกันเฉพาะอันนี้ใช้ได้กับฉันเท่านั้น :-)
เราคือ Borg

3

ในที่สุดฉันก็พบทางออกในSpring Docs :

หากต้องการปิดใช้งานการใช้นามสกุลไฟล์อย่างสมบูรณ์คุณต้องตั้งค่าทั้งสองอย่างต่อไปนี้:

 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" ก็จะใช้งานได้ แต่ต้องมี URL ของทุกคนเป็นอย่างนั้น ... ซึ่งไม่ใช่การเข้ารหัส "มาตรฐาน" แต่ใช้ได้จริง รู้สึกเหมือนเป็นแมลง: |

การทำงานอื่น ๆ คล้ายกับวิธี "ต่อท้ายสแลช" คือการย้ายตัวแปรที่จะมีจุด "inline" อดีต:

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

ตอนนี้จุดทั้งหมดจะได้รับการเก็บรักษาไว้โดยไม่ต้องมีการดัดแปลงหรือ regex


1

ตั้งแต่ Spring 5.2.4 (Spring Boot v2.2.6.RELEASE) PathMatchConfigurer.setUseSuffixPatternMatchและContentNegotiationConfigurer.favorPathExtensionเลิกใช้แล้ว ( https://spring.io/blog/2020/03/24/spring-framework-5-2-5-available-nowและhttps://github.com/spring-projects/spring-framework/issues/24179 )

ปัญหาที่แท้จริงคือลูกค้าร้องขอประเภทสื่อเฉพาะ (เช่น. com) และ Spring จะเพิ่มประเภทสื่อทั้งหมดตามค่าเริ่มต้น ในกรณีส่วนใหญ่คอนโทรลเลอร์ REST ของคุณจะสร้าง JSON เท่านั้นดังนั้นจึงไม่สนับสนุนรูปแบบเอาต์พุตที่ร้องขอ (.com) เพื่อเอาชนะปัญหานี้คุณควรจะทำได้ดีด้วยการอัพเดทตัวควบคุมส่วนที่เหลือของคุณ (หรือวิธีการเฉพาะ) เพื่อสนับสนุนรูปแบบ 'ouput' ( @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();
    }
}

Spring 5.3 และสูงกว่าจะตรงกับคำต่อท้ายที่ลงทะเบียนแล้วเท่านั้น (ชนิดสื่อบันทึก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.