2010-01-10 4 views
1

J'ai utilisé Internet pour un exemple qui utiliserait à la fois les contrôleurs spring-json et annotés, je suis nouveau au printemps, donc je n'ai pas eu de chance d'adapter la configuration au printemps- Les échantillons de json (il utilise SimpleController et autres)Aide pour spring-json utilisant des contrôleurs annotés

Actuellement, j'ai un contrôleur avec 2 mappings, l'un liste les résultats en html (et fonctionne), l'autre devrait rendre json pour certains appels ajax mais quand j'accède à l'url il renvoie un 404 et demande /myapp/jsp/jsonView.jsp. Le code sur la méthode show s'exécute et il valide même la présence du paramètre id, donc il semble que le problème est qu'il ne sait pas comment rendre, autant que je sache, c'est ce que fait le bean viewResolver.

Merci à l'avance pour toute aide :)

Voici ce que j'ai:

@Controller 
public class ItemController { 

//This one works 
@RequestMapping(value = "/items", method = RequestMethod.GET) 
public ModelMap list() { 
    ModelMap map = new ModelMap(); 
    map.addAttribute("item", "value"); 
    return map; 
} 
//This one returns 404, asks for jsonView.jsp 
@RequestMapping(value = "/items.json", method = RequestMethod.GET) 
public ModelAndView show(@RequestParam(value = "id", required = true) String id) { 
    Map model = new HashMap(); 
    model.put("firstname", "Peter"); 
    model.put("secondname", "Schmitt"); 
    return new ModelAndView("jsonView", model); 
    } 
} 

sur myapp-servlet.xml:

<bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver"/> 

sur views.xml:

<beans> 
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView"> 
    <property name="encoding"> 
     <value>UTF-8</value> 
    </property> 
    <property name="contentType"> 
     <value>application/json</value> 
    </property> 
    <property name="jsonWriter"> 
     <ref bean="sojoJsonWriter"/> 
    </property> 
    <property name="jsonErrors"> 
     <list> 
      <ref bean="statusError"/> 
      <ref bean="modelflagError"/> 
     </list> 
    </property> 
</bean> 

<bean name="sojoJsonWriter" class="org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter"> 
    <property name="convertAllMapValues"> 
     <value>true</value> 
    </property> 
</bean> 

<bean name="statusError" class="org.springframework.web.servlet.view.json.error.HttpStatusError"> 
    <property name="errorCode"> 
     <value>311</value> 
    </property> 
</bean> 
<bean name="modelflagError" class="org.springframework.web.servlet.view.json.error.ModelFlagError"> 
    <property name="name"> 
     <value>failure</value> 
    </property> 
    <property name="value"> 
     <value>true</value> 
    </property> 
</bean> 

web.xml:

<servlet> 
<servlet-name>myapp</servlet-name> 
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
<load-on-startup>2</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>myapp</servlet-name> 
<url-pattern>/myapp/*</url-pattern> 
</servlet-mapping> 

Répondre

1

Le problème était avec le résolveur de vue sur le servlet.xml, a ajouté ap: attribut de commande de sorte qu'il chargerait avant la InternalResourceViewResolver

<bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver" p:order="1"/> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/"p:suffix=".jsp" p:order="10"/> 
2

Il pourrait y avoir une autre alternative: êtes-vous capable de passer à ressort 3 (il a maintenant libérer état)? Il y a un ContentNegotiationResolver fantastique qui aide beaucoup quand il s'agit de la négociation de contenu et de la résolution de la vue.

 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
<property name="mediaTypes"> 
    <map> 
    <entry key="xml" value="application/xml"/> 
    <entry key="json" value="application/json"/> 
... 
 

Si maintenant annexant .json à votre chemin d'URL ou en utilisant respectivement en-tête HTTP 'Accept', objet passé (voir model.put (...)) est publié en feuilleton en conséquence. Pour json spring 3 utilise jackson par défaut.

+0

Je ne considère, mais il y a déjà une part importante de l'application développé qui a 0 tests, ne peut pas se permettre de migrer cette partie ancienne :( – albemuth

Questions connexes