2015-12-08 13 views
5

Ich habe eine Webanwendung mit spring mvc 3 geschrieben. Sie bietet einen einzelnen Endpunkt, der JSON zurückgibt. Ich habe es erfolgreich mit URL-Parametern ausgeführt, aber jetzt muss ich dies ändern, um stattdessen Pfadvariablen zu verwenden.Spring-MVC-Test - Ein Mock-Repository einsperren, wenn der Integrationstest einen bestimmten Typ erfordert

änderte ich meinen Controller

aus:

@Controller 
public class DataController { 

    @Autowired 
    private IDataService dateService; 

    @RequestMapping(
      value = "/some/data", 
      method = RequestMethod.GET, 
      produces = "application/json" 
    ) 
    public @ResponseBody Data getDataByCode(@RequestParam String code) { 
     return versionService.getDataByCode(code); 
    } 
} 

zu:

@Controller 
public class DataController { 

    @Autowired 
    private IDataService dateService; 

    @RequestMapping(
      value = "/some/data/{code}", 
      method = RequestMethod.GET, 
      produces = "application/json" 
    ) 
    public @ResponseBody Data getDataByCode(@PathVariable String code) { 
     return versionService.getDataByCode(code); 
    } 
} 

und meinen Web-xml die URL zur Karte ...

aus:

<servlet> 
     <servlet-name>dataBycode</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:/config/servlet-config.xml</param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dataBycode</servlet-name> 
     <url-pattern>/some/data</url-pattern> 
    </servlet-mapping> 

zu:

<servlet> 
     <servlet-name>dataBycode</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:/config/servlet-config.xml</param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dataBycode</servlet-name> 
     <url-pattern>/some/data/*</url-pattern> 
    </servlet-mapping> 

Aber ich 404 für die HTTP-Anforderung erhalten: http://localhost/some/data/1234 Wo ich weiß, dass 1234 existiert.

Um das Ganze abzurunden, kommt die Anfrage nie sogar auf die Controller-Methode, so dass es die Web-XML-URL-Musterkonfiguration sein muss.

Als Test habe ich versucht, das URL-Muster zu ändern, um genau eine Anfrage mit einem Code zu entsprechen, und es gab JSON wie erwartet zurück, also kenne ich das URL-Muster. Ich weiß einfach nicht, wie ich es beheben kann.

Ich habe versucht:

  1. /
  2. /*
  3. /some/Daten *
  4. /some/data/*
+0

Wie ist Ihre Spring-Konfiguration geladen? – fabballe

+0

Es ist durch xml-Konfiguration geladen, glauben Sie, dass das einen Einfluss auf die App haben könnte, die mit allem außer Pfadvariablen arbeitet? Wenn dem so ist, werde ich dieses Detail zu der Frage hinzufügen. Merken Sie sich die Anwendungsfunktionen wie erwartet, wenn ich keine Pfadvariable verwende. Zum Beispiel funktioniert es in Ordnung mit einem Pfadparameter als '' 'code''' Wert. – Jeremy

+0

In der Tat sollte die Federkonfiguration nicht das Problem sein. Ich füge eine Antwort mit ein paar Tipps hinzu. – fabballe

Antwort

1

Ihre URL-Muster sein sollte:

<servlet-mapping> 
     <servlet-name>dataBycode</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

In der zweiten Hand, können Sie versuchen http://localhost/some/data/myTest den Zugriff auf und legte eine System.out .println in der Methode getDataByCode, um festzustellen, ob die Methode aufgerufen wurde.

Wenn es funktioniert denke ich, das Problem kommt von Spring MVC, die "1234" als Ganzzahl und nicht als String interpirieren.

+0

Hum interessant Ich werde das ausprobieren und zurück zu dir – Jeremy

+0

Ich änderte das URL-Muster zu '' '' '' 'und es scheint um jetzt zu arbeiten, hatte ich am Ende kein Problem mit dem Pfadvariablentyp. – Jeremy

+0

Seltsam, dass ich das in der Vergangenheit versucht hatte, vielleicht hat sich meine Konfiguration geändert, seit ich diese Frage gepostet habe, die das tiefere Problem behoben hat. – Jeremy

0

Wenn Ihre Verwendung von Eclipse:

  1. Doppelklick auf Ihrem Server innerhalb Server anzeigen

server view

  1. Zum Module Tab

enter image description here

  1. Überprüfen Sie den Pfad für Ihre Anwendung

Die endgültige Anwendung url = path + some/data/1234

+0

Wie ich in meiner Frage gesagt habe, weiß ich, dass der Pfad korrekt ist, weil ich den Zugriff auf einen bestimmten Wert in meinem web.xml-URL-Format zulassen kann und die erwarteten Daten zurückgibt. Es ist nur, wenn ich versuche, eine Pfadvariable zu verwenden, die das Problem auftritt, und ich bekomme einen 404. – Jeremy