2015-03-06 21 views
7

Tôi đang sử dụng mvc 4 mùa xuân và cố gắng trả về một đơn giản map thành ajax - từ bộ điều khiển của tôi sang tệp jsp.Trả về một cấu trúc bản đồ đơn giản từ bộ điều khiển mvc mùa xuân đến ajax

Bộ điều khiển:

@RequestMapping(value = "/ajaxtest", method = RequestMethod.GET) 
    public @ResponseBody 
    Map<String, String> myTest() { 
     System.out.println("------------------------------------test"); 

     Map<String,String> myMap = new HashMap<String, String>(); 
     myMap.put("a", "1"); 
     myMap.put("b", "2"); 
     return myMap; 
    } 

Ajax từ file jsp:

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      dataType: "json", 
      contentType: "application/json;charset=utf-8", 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

Nhưng tôi không nhận được bất kỳ cảnh báo nhưng chỉ là lỗi HTTP/1.1 406 Not Acceptable.

Tuy nhiên, việc thay đổi mã để trả lại chuỗi đơn giản hoạt động tốt. Bộ điều khiển:

@RequestMapping(value = "/ajaxtest", method = RequestMethod.GET) 
    public @ResponseBody 
    String myTest() { 
     System.out.println("------------------------------------test"); 
     return "hello"; 
} 

Ajax:

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

động thông báo 1hello từ ajax như mong đợi.

tôi đã thêm các tập tin jar jackson như mong đợi (bởi pom.xml):

dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.5.1</version> 
    </dependency> 

Am tôi thiếu cái gì? Tôi chỉ muốn trả về một cấu trúc ánh xạ đơn giản (hoặc cấu trúc lớp khác trong tương lai).

Cập nhật: Từ giao diện điều khiển mùa xuân (Không chắc chắn rằng nó có liên quan): Resolving exception from handler [null]: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

Cảm ơn trước! Mike

Trả lời

2

Cố gắng thêm consumes="application/json"produces={ "application/json"} đến @RequestMapping để cho quá trình mùa xuân json bạn

CẬP NHẬT mô tả 406 lỗi

Lỗi HTTP 406 Không được chấp nhận

Giới thiệu

Một khách hàng (ví dụ: trình duyệt web của bạn hoặc rô bốt CheckUpDown của chúng tôi) có thể chỉ ra cho máy chủ Web (chạy trang Web) các đặc tính của dữ liệu mà nó sẽ chấp nhận trở lại từ máy chủ Web. Điều này được thực hiện bằng cách sử dụng 'chấp nhận tiêu đề' của các loại sau:

Chấp nhận: Các loại MIME được khách hàng chấp nhận. Ví dụ: trình duyệt chỉ có thể chấp nhận các loại dữ liệu (tệp HTML, tệp GIF, v.v.), nó biết cách xử lý. Accept-Charset: Các bộ ký tự được chấp nhận bởi khách hàng. Chấp nhận mã hóa: Mã hóa dữ liệu được khách hàng chấp nhận, ví dụ: các định dạng tệp mà nó hiểu được. Chấp nhận ngôn ngữ: Các ngôn ngữ tự nhiên (tiếng Anh, tiếng Đức, v.v.) được khách hàng chấp nhận. Phạm vi chấp nhận: Liệu khách hàng có chấp nhận phạm vi byte từ tài nguyên tức là một phần tài nguyên hay không. Nếu máy chủ Web phát hiện rằng dữ liệu mà nó muốn trả lại không được chấp nhận cho máy khách, nó trả về một tiêu đề chứa mã lỗi 406.

Điều đó có nghĩa là bạn bằng cách nào đó nên thay đổi logic máy chủ của bạn để chấp nhận MIME/Charset/Encoding, v.v.về yêu cầu bạn đã gửi từ khách hàng. Không thể nói chính xác những gì sai nhưng cố gắng chơi với tiêu đề và tiêu thụ của RequestMapping.

+0

Đã thêm '@RequestMapping (value ="/ajaxtest ", method = RequestMethod.GET, tiêu thụ =" application/json ", tạo = {" application/json "})' nhưng không giải quyết được sự cố ... – Mike

0

Hãy thử điều này:

$.ajax({ 
     type:"GET", 
     url: "/ajaxtest", 
     dataType: "json", 
     contentType: "application/json;charset=utf-8", 
     success: function(data){ 
     alert("1"); 
     alert(data); 
    } 
    }); 
+0

Không giải quyết được sự cố ... – Mike

-1

Bạn cần phụ thuộc này:

<dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version></version> 
    </dependency> 

Thêm này nếu đã có không:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
<property name="messageConverters"> 
    <list> 
    <ref bean="jacksonMessageConverter"/> 
    </list> 
</property> 
</bean> 
+0

Đã thêm cả 'jackson-mapper-asl' và' jackson-core-asl' vào phiên bản '1.9.2' nhưng vẫn không hoạt động ... – Mike

+0

Bạn là phụ thuộc gốc OK, spring mvc 4 sử dụng jackson 2.x. Vì vậy, tôi sẽ tư vấn khá ngược lại, hãy chắc chắn rằng bạn không có các phụ thuộc jackson trước phiên bản 2.x. Ngoài ra, tôi nghĩ rằng các jackson-databind duy nhất dep. là đủ vì nó quá lôi kéo lõi và chú thích –

1

"vấn đề" của bạn là do yêu cầu của bạn kết thúc bằng số .html. Bạn cần phải thêm các cấu hình sau đây để làm cho nó làm việc như bạn mong đợi

<bean id="contentNegotiationManager"    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> 
    <property name="favorPathExtension" value="false" /> 
    <property name="defaultContentType" value="application/json" /> 
</bean> 

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" /> 

và hơn làm như @StanislavL gợi ý thêm produces={ "application/json"} không thêm tiêu thụ gây ra bạn không đăng bất kỳ JSON

một lời giải thích

Khi mùa xuân xác định biểu diễn mà nó chuyển đổi đầu tiên, hãy xem phần đường dẫn của yêu cầu (ví dụ: .html, .json, .xml), có vẻ như một tham số đã thiết lập đại diện chuyển đổi một cách rõ ràng cho tiêu đề Chấp nhận (cuộc gọi PPA chiến lược)

đó là lý do ví dụ của bạn hoạt động

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

bạn đang nhận được HTML trở lại. Tuy nhiên với yêu cầu

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      dataType: "json", 
      contentType: "application/json;charset=utf-8", 
      success : function(data) { 
       alert("1"); 
       alert(data); 
      } 
     }); 
    } 

bạn một cách rõ ràng rằng bạn mong đợi JSON lại từ máy chủ, tuy nhiên, .html được gợi ý rằng nó phải được HTML thay vào đó, và bạn kết thúc trong vấn đề

Để tìm hiểu các chi tiết của chiến lược thương lượng nội dung bạn nên đọc này blog, nó gần như nổi tiếng bởi bây giờ :) Nó cũng sẽ cho bạn thấy phiên bản cấu hình java tinh khiết

5

Tôi không biết nếu nó đúng cách nhưng tôi đã giải quyết nó như sau .

Trong bộ điều khiển, tôi chuyển đổi bản đồ để json:

@RequestMapping(value = "/ajaxtest", method = RequestMethod.GET) 
    public @ResponseBody 
    String myTest() { 
     System.out.println("------------------------------------random"); 

     Map<String,String> myMap = new HashMap<String, String>(); 
     myMap.put("a", "1"); 
     myMap.put("b", "2"); 
     ObjectMapper mapper = new ObjectMapper(); 
     String json = ""; 
     try { 
      json = mapper.writeValueAsString(myMap); 
     } catch (JsonProcessingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return json; 
} 

và trong jsp:

function testAjax() { 
     $.ajax({ 
      url : '../../ajaxtest.html', 
      type:"GET", 
      contentType: "application/json;charset=utf-8", 
      success : function(data) { 
       alert("1"); 
       alert(data); 
       var obj = jQuery.parseJSON(data); 
       alert(obj.a); 
       alert(obj.b); 
      } 
     }); 

Cảm ơn tất cả các bạn! Mike }

+2

Đó là OK, nhưng bạn đã cố định cấu hình như tôi đã gợi ý chưa. Nếu không, bạn sẽ phải thực hiện công việc thủ công này trên mọi yêu cầu dự kiến ​​JSON và bạn mất điểm khung xử lý những thứ cho bạn –

1

cuộc gọi Ajax của bạn nên một cái gì đó tương tự như:

$("#someId").click(function(){ 
      $.ajax({ 
       url:"getDetails",  
       type:"GET", 
       contentType: "application/json; charset=utf-8", 
       success: function(responseData){ 
        console.log(JSON.stringify(responseData)); 
        // Success Message Handler 
       },error:function(data,status,er) { 
        console.log(data) 
       alert("error: "+data+" status: "+status+" er:"+er); 
       } 
      }); 
      }); 

Xuân điều khiển Mã nên như sau:

@RequestMapping(value="/getDetails",method=RequestMethod.GET) 
    public @ResponseBody Map<String,String> showExecutiveSummar(){ 
     Map<String,String> userDetails = new HashMap<String,String>(); 
     userDetails .put("ID","a"); 
     userDetails .put("FirstName","b"); 
     userDetails .put("MiddleName","c"); 
     userDetails .put("LastName","d"); 
     userDetails .put("Gender","e"); 
     userDetails .put("DOB","f"); 
    return userDetails 
    } 

Bạn cũng có thể tham khảo link này để tìm hiểu thư viện mà hỗ trợ chức năng này.

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