2011-02-07 30 views
15

Tôi muốn trả lại chế độ xem từ Bộ điều khiển MVC của Spring tùy thuộc vào logic. Nếu xảy ra lỗi, tôi muốn trả lại JSON, nếu không, một chế độ xem HTML. Điều này giống như ASP.NET MVC ActionResult, nơi bạn có thể trả về bất kỳ dạng xem nào và nó sẽ hiển thị kết quả, và nó sẽ không phụ thuộc vào kiểu nội dung đang được gửi trong yêu cầu. Tôi không thể tìm thấy bất kỳ ví dụ nào về điều này.Trả lại JSON hoặc Chế độ xem từ Bộ điều khiển MVC Xuân

+2

http://stackoverflow.com/questions/6173093/spring-return-json-from-controller-as-modelandview – Bozho

Trả lời

17

Tôi đã đạt được điều này với những điều sau đây.

@RequestMapping(value="/users", method=RequestMethod.POST) 
public Object index(@RequestBody SearchUsersViewModel model, HttpServletResponse response) { 

    model.setList(userService.getUsers(model)); 

    if(true) 
    { 
     return new ModelAndView("controls/tables/users", "model", model); 
    } 
    else 
    { 
     return JsonView.Render(model, response); 
    }  
} 

JsonView.java

public class JsonView { 

    public static ModelAndView Render(Object model, HttpServletResponse response) 
    { 
     MappingJacksonHttpMessageConverter jsonConverter = new MappingJacksonHttpMessageConverter(); 

     MediaType jsonMimeType = MediaType.APPLICATION_JSON; 


     try { 
      jsonConverter.write(model, jsonMimeType, new ServletServerHttpResponse(response)); 
     } catch (HttpMessageNotWritableException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

JS Chức năng này sẽ làm cho các cuộc gọi

config.request = $ 
       .ajax({ 
        url : url, 
        data : $.toJSON(def.data), 
        type : def.type, 
        dataType : def.dataType, 
        processData : true, 
        contentType : def.contentType, 
        success : function(data) { 

         try { 
          var json = data; 
          if (typeof data === "String" || typeof data == "string") { 
           json = (eval('(' + data + ')')); 
          } 
          if ('object' === typeof json) { 
           if (json.Validation && json.Validation.Errors.length > 0) { 

            $.each(json.Validation.Errors, function() { 
             // Error Code Check 
            }); 

            // Error Callback 
            if (typeof (def.errorCallback) == 'function') { 
             def.errorCallback(json); 
            } 
           } else { 
            def.callback(data); 
           } 
          } else { 
           def.callback(data); 
          } 
         } catch (e) { 
          def.callback(data); 
          // Hide Loading 
         } 
        }, 
        error : function(data) { 


        } 
       }); 
+1

Trong mã của bạn, bạn có 'if (true)' - vậy khi nào JSON được trả về? – Paul

+0

Tôi chỉ đang thử nghiệm ở đó. Tôi sẽ kiểm tra lỗi trong đối tượng trả về sau đó trả về json, ngược lại trả về HTML. –

0

Có lẽ bạn có thể xem ResolveBundleViewResolver, cho phép bạn kết hợp chế độ xem. docs cung cấp một số thông tin về cách sử dụng.

Từ các tài liệu (ví dụ là để trộn gạch và JSTL, nhưng nên áp dụng cho những người khác cũng) ...

tập tin bối cảnh

<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver"> 
    <property name="basename" value="views"/> 
</bean> 

views.properties

... 
welcomeView.(class)=org.springframework.web.servlet.view.tiles2.TilesView 
welcomeView.url=welcome (this is the name of a Tiles definition) 

vetsView.(class)=org.springframework.web.servlet.view.tiles2.TilesView 
vetsView.url=vetsView (again, this is the name of a Tiles definition) 

findOwnersForm.(class)=org.springframework.web.servlet.view.JstlView 
findOwnersForm.url=/WEB-INF/jsp/findOwners.jsp 
... 
4

Lập trình bộ điều khiển của bạn để trả về một tên chế độ xem logic khác nhau tùy thuộc vào điều kiện. Ví dụ:

@RequestMapping(value="/hello/{name}", method=RequestMethod.GET) 
public ModelAndView hello(@PathVariable String name) { 
    String viewName = (name.length() > 1) ? "hello" : "error"; 
    ModelAndView mav = new ModelAndView(viewName); 
    mav.addObject("name", name); 
    return mav; 
} 

Định cấu hình chế độ xem phân giải để giải quyết tên chế độ xem "error" thành chế độ xem JSON. Spring cung cấp nhiều cách để cấu hình tên view để xem bản đồ, bao gồm:

Ví dụ, để sử dụng BeanNameViewResolver:

<bean name="error" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> 

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> 
    <property name="order" value="1"/> 
</bean> 
5

Chỉ trong trường hợp và bạn muốn quay trở lại Json trên ngoại trừ bạn có thể làm như sau:

@ExceptionHandler(Exception.class) 
    @ResponseBody 
     public void handleIOException(Exception exception,HttpServletRequest request, HttpServletResponse response) { 
     response.setContentType("application/json"); 
     String json = "{\"Name\": 50}"; 
     PrintWriter out= response.getWriter(); 
     out.write(json); 
     } 

Tôi không chắc chắn rằng đây là những gì bạn muốn làm, nhưng chỉ trong trường hợp .... :)

+0

Nếu một lỗi xảy ra trong một bộ điều khiển, điều này sẽ bắt nó và trả về JSON? –

+0

A xa như tôi nhớ có nó sẽ bắt. –

2

Không có gì để ngăn bạn quay trở lại thực tế View đối tượng trực tiếp từ phương thức điều khiển của bạn - nó không phải là tên khung nhìn. Vì vậy, bộ điều khiển của bạn có thể xây dựng một đối tượng View bằng cách sử dụng logic riêng của nó và trả về điều đó, có hoặc không được bao bọc trong đối tượng ModelAndView.

Điều này có lẽ đơn giản hơn là cố gắng thuyết phục khung làm việc ViewResolver làm việc này cho bạn, mặc dù điều đó cũng có tác dụng.

-1

Để mở rộng câu trả lời Chin Huang, đây là những gì làm việc cho tôi. Không cần cấu hình.

response.setStatus(500); 
return new ModelAndView(new MappingJacksonJsonView(), model); 

Điều này sẽ tự động chuyển đổi mô hình thành JSON và ghi để phản hồi. Dưới đây mô hình là loại Map<String,Object> và phản ứng là loại HttpServletResponse

+0

Ý tưởng tồi để khởi tạo chế độ xem JSON mới mỗi khi bạn cần trả lại. –

+0

Ý tưởng hay là gì @JukkaDahlbom? –

Các vấn đề liên quan