2017-09-16 3 views
1

J'ai un contrôleur pour renvoyer un Payload JSONSpring MVC préparation JSON mais le chargement d'une page à la place

@RequestMapping(value = "/MerchantMonitoringAPI", method = RequestMethod.GET,produces = "application/json") 
public String MerchantMonitoring() { 

    ApplicationContext context = 
      new ClassPathXmlApplicationContext("Spring-Module.xml"); 

     TopMerchantsDAO topMerchantsDAO = (TopMerchantsDAO) context.getBean("topMerchantsDAO"); 
     TopMerchants topMerchants = topMerchantsDAO.retrieveMerchantList(); 

     for(String temp:topMerchants.getMerchantList()) 
     { 
      System.out.println(temp); 
     } 

     Gson gson = new Gson(); 
     Type type = new TypeToken<TopMerchants>() {}.getType(); 

     String jsonPayload = gson.toJson(topMerchants, type); 
     System.out.println(jsonPayload); 

     return jsonPayload; 
} 

Il essaie de me rediriger vers une vue avec le nom de la page comme JSON (localhost: 8080/{"merchantList": ["Apple", "Google"]}. jsp)

Comment arrêter ceci et renvoyer la charge utile JSON ??

+0

pouvez-vous ajouter ce @RestController sur le RequestMapping? –

+0

@georgesvan qui a fonctionné! –

+0

Nice. N'hésitez pas à valider ma réponse ci-dessous –

Répondre

2

Ajouter @RestController au-dessus du @RequestMapping

@RestController 
    @RequestMapping(value = "/MerchantMonitoringAPI", method = 
    RequestMethod.GET,produces = "application/json") 
    public String MerchantMonitoring() {...} 

Parce que la méthode est maintenant annotées avec @RestController, les objets sont revenus de ces méthodes passera par la conversion des messages pour produire une représentation des ressources JSON pour le client.

0

Si vous voulez avoir plusieurs méthodes pour le retour JSON et la page dans la même classe, vous pouvez toujours annoter votre classe avec @Controller, et la méthode pour JSON annotée avec @ResponseBody

Si vous annotée class with @RestController - toutes les méthodes à l'intérieur de la classe fonctionneront comme @ResponseBody et la classe sera comme @Controller annotée. Bien sûr, il s'agit d'une meilleure approche (pour ne pas inclure les méthodes de retour de page et JSON dans un seul contrôleur).

Remarque importante! Vous pouvez utiliser @RestController uniquement pour la classe (au lieu de @Controller), pas pour les méthodes. Si vous ouvrez la source de cette annotation, vous verrez entre autres choses la prochaine:

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Controller 
@ResponseBody 
public @interface RestController { 
    String value() default ""; 
} 

et ElementType.TYPE a un commentaire:

classe, interface (y compris le type d'annotation), ou ENUM déclaration