2015-05-18 23 views
5

Znalazłem jedno bardzo dziwne zachowanie Spring MVC.Spring MVC zwraca HTTP 406 na adres URL z kropką

mam kontrolera z metodą:

@RequestMapping (value = "/delete/{id:.*}", method = RequestMethod.DELETE) 
public ResponseEntity<Response> delete(@PathVariable (value = "id") final String id) { 
    HttpStatus httpStatus = HttpStatus.OK; 
    final Response responseState = new Response(ResponseConstants.STATUS_SUCCESS); 
    try { 
     POJO pojo = mediaFileDao.findById(id); 
     if (pojo != null) { 
      delete(pojo); 
     } else { 
      httpStatus = HttpStatus.NOT_FOUND; 
      responseState.setError("NOT_FOUND"); 
     } 
    } catch (Exception e) { 
     httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; 
     responseState.setError(e.getMessage()); 
    } 
    return new ResponseEntity<>(responseState, httpStatus); 
} 

Więc problem jest, gdy id zawiera kropkę (ex "my_file.wav"). Wiosną powraca HTTP 406 w każdym przypadku, ale jeśli id ​​nie zawiera kropki , Spring zwraca responseState (jako json), jak I expet. Próbowałem go naprawić w inny sposób (dodaj @ResponseBody, zmień wersję jackson, obniż wersję na 4.0), ale bez żadnych rezultatów.

Czy ktoś może mi pomóc?

UPDATE włączyć logi na wiosnę mvn i zobaczyłem ten

ID zawiera dot:

DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Resolving exception from handler [public org.springframework.http.ResponseEntity<my.package.response.Response> my.package.Controller.deleteMediaFile(java.lang.String) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public org.springframework.http.ResponseEntity<my.package.response.Response> my.package.Controller.deleteMediaFile(java.lang.String) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 
DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public org.springframework.http.ResponseEntity<my.package.response.Response> my.package.Controller.deleteMediaFile(java.lang.String) throws java.lang.Exception]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation 

ID nie zawiera kropki:

DEBUG org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdviceChain - Invoking ResponseBodyAdvice chain for [email protected] 
DEBUG org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdviceChain - After ResponseBodyAdvice chain [email protected] 

ROZWIĄZANIE

Spring does not ignore file extension

SpringMVC: Inconsistent mapping behavior depending on url extension

Odpowiedz

2

W swojej serwletu xml, wyłącz Wiosny przyrostek dopasowanie:

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

Jest to funkcja, która pozwala rozmówcy, aby określić, jak chcą ich treść zwrócony przez trzymanie go jako przyrostek na końcu adresu URL:

GET /user/bob.json 
GET /use/bob.jsp 

Ale 99 ze 100 projektów nie korzysta z tej funkcji. I powoduje problemy tylko wtedy, gdy na końcu adresu URL znajdują się kropki.

+0

Twoja odpowiedź wygląda poprawnie, ale to mi nie pomaga. Spring wciąż wysyłał HTTP 406. – Vartlok

+0

teraz spróbuj zmienić requestmapping, aby był po prostu '@RequestMapping (value ="/delete/{id} ", method = RequestMethod.DELETE)' –

+0

I wciąż HTTP 406 – Vartlok

0

Musisz mieć zawartość niestandardowych Service Manager negocjacje zdefiniowany następująco:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> 

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
</bean> 

pochodził z tej article