2010-11-09 9 views
8

Sto provando a migrare un progetto Web da Jersey a Spring MVC 3.0. Il processo è stato molto semplice fino al momento in cui ho iniziato a migrare i controller che si supponeva gestissero gli URL con le notazioni dot: "/ miaApp/resources/create/root.subFolder1". Spring MVC sembra tagliare spudoratamente il ".subFolder1" parte dall'URL, che avviene in profondità codice del framework all'interno (vedi AbstractUrlHandlerMapping classe)Come modificare il comportamento di Spring MVC nella gestione del carattere url 'punto'

uriTemplateVariables.putAll(getPathMatcher().extractUriTemplateVariables(matchingPattern, urlPath)); 

Quindi il mio metodo di controllo viene invocato con radice parametro path , non root.subFolder1

Mi piacerebbe davvero trovare un modo per personalizzare questo comportamento. Qualche consiglio?

PS. Il requisito è in qualche modo quello di mantenere la struttura dell'URL esistente, ovvero soluzioni alternative come passare ai parametri di query "/ myApp/resources/create/? Path = root.subFolder1" Non posso prendere in considerazione.

PS. La mia Primavera config sembra

<mvc:annotation-driven/> 

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

<context:component-scan base-package="my.app.pkg"/> 
+0

A proposito, in futuro, potrebbe essere una buona idea includere il tag Java, come che potrebbe avere più visibilità. – AHungerArtist

risposta

8

Prova questa:

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

Questo dovrebbe fare in modo che la primavera non cercherà di analizzare le estensioni.

Consulta anche: Spring MVC @PathVariable getting truncated

E: Spring Documentation

file di configurazione potenziali:

web.xml (dove ho impostato la roba servlet)

<servlet> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet 
    </servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/spring/*.xml,classpath*:applicationContext.xml,classpath*:restApplicationContext.xml 
     </param-value> 
    </init-param> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

E poi nel WEB/INF/spring/mvc-config.xml Ho qualcosa di simile a questo:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

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

Se questo ha aiutato, accettalo. In caso contrario, spiegare ulteriormente il problema :) – AHungerArtist

+0

Devo dichiarare questo bean da solo o fuori è come una dipendenza da qualche altro bean? Sembra solo dichiararlo in primavera servlet xml config non aiuta ... –

+0

Suppongo che la configurazione servlet.xml sia dove si configura il servlet. Usi qualsiasi configurazione di init-param per contextConfigLocation? – AHungerArtist

0

La risposta sopra dovrebbe correggere, ma assicurarsi di rimuovere <mvc:annotation-driven/> dalla configurazione XML, altrimenti la definizione del bean viene annullata da una parte del tag guidato dall'annotazione.

Vedere java docs e source code per tutte le configurazioni mancanti quando questo tag di convenienza viene rimosso.

2

Affinché

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 

a lavorare è necessario rimuovere/commentare la

<mvc:annotation-driven /> 
<mvc:default-servlet-handler /> 

e qualsiasi altro MVC: configurazioni definite come essi sostituiscono le dichiarazioni di fagioli personalizzati.

8

Un'altra possibilità che può essere più semplice in alcune circostanze è aggiungere un finale / alla fine dell'URL.

Così il vostro URL sarebbe /myApp/resources/create/root.subFolder1/

Questo funziona nella mia app utilizzando Spring MVC 3.1.

+0

Questa era la soluzione migliore per me. Avevo bisogno dei tag di annotazione per il resto del sito. –

1

Questa era una cagna. Un ragazzo della nostra squadra l'ha fatto lavorare durante il fine settimana. Stavamo andando con il trattino basso, ma ce l'ha fatta. Ha rimosso @Controller dagli attributi della classe controller e ha lasciato @RequestMapping in bianco per la classe. Sui metodi pubblici per Http get and put ha aggiunto "/2.0/" al @RequestMapping. Esempio di seguito.

@RequestMapping 
public class EndpointController { 

@RequestMapping(value="/2.0/endpoint", method = RequestMethod.POST, 
consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<EndpointView> create(@Valid @RequestBody EndpointView endpointParams, HttpServletRequest request) 

Buona fortuna a tutti. Questo problema è stato risucchiato.

1

Ho fatto quasi lo stesso di Robert Beltran ma ho lasciato l'annotazione @Controller per la classe. Importante è mettere "/1.0/" nel @RequestMapping sui metodi, non nell'annotazione della classe.
Il mio esempio:

@Controller 
@RequestMapping("") 
public class ClientApi { 

private final String API_PREFIX = "/api/1.0/client"; 

@RequestMapping(value = API_PREFIX + "/{clientId}", method = RequestMethod.GET) 
@ResponseBody 
public ClientDetailsImpl get(@PathVariable String clientId) { 
    // my code 
} 
} 
+0

Ho appena visto questo perché siamo stati colpiti di nuovo. Progetto diverso. Grazie! –

Problemi correlati