คำขอ Spring JSON รับ 406 (ไม่สามารถยอมรับได้)


85

นี่คือจาวาสคริปต์ของฉัน:

    function getWeather() {
        $.getJSON('getTemperature/' + $('.data option:selected').val(), null, function(data) {
            alert('Success');                               
        });
    }

นี่คือตัวควบคุมของฉัน:

@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET)
@ResponseBody
public Weather getTemparature(@PathVariable("id") Integer id){
    Weather weather = weatherService.getCurrentWeather(id);
        return weather;
}

spring-servlet.xml

<context:annotation-config />
<tx:annotation-driven />

รับข้อผิดพลาดนี้:

GET http://localhost:8080/web/getTemperature/2 406 (Not Acceptable)

ส่วนหัว:

ส่วนหัวการตอบกลับ

Server  Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length  1070
Date    Sun, 18 Sep 2011 17:00:35 GMT

ขอส่วนหัว

Host    localhost:8080
User-Agent  Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept  application/json, text/javascript, */*; q=0.01
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection  keep-alive
X-Requested-With    XMLHttpRequest
Referer http://localhost:8080/web/weather
Cookie  JSESSIONID=7D27FAC18050ED84B58DAFB0A51CB7E4

หมายเหตุที่น่าสนใจ:

ฉันได้รับข้อผิดพลาด 406 แต่แบบสอบถามไฮเบอร์เนตใช้งานได้ในขณะเดียวกัน นี่คือสิ่งที่บันทึก Tomcat พูดทุกครั้งที่ฉันเปลี่ยนการเลือกในดรอปบ็อกซ์:

 select weather0_.ID as ID0_0_, weather0_.CITY_ID as CITY2_0_0_, weather0_.DATE as DATE0_0_, weather0_.TEMP as TEMP0_0_ from WEATHER weather0_ where weather0_.ID=?

ปัญหาคืออะไร? มีคำถามที่คล้ายกันสองข้อใน SO ก่อนหน้านี้ฉันลองใช้คำแนะนำที่ยอมรับทั้งหมดที่นั่น แต่ไม่ได้ผลฉันเดา

ข้อเสนอแนะใด ๆ ? อย่าลังเลที่จะถามคำถาม ...

คำตอบ:


107

406 ไม่ยอมรับ

ทรัพยากรที่ระบุโดยคำร้องขอสามารถสร้างเอนทิตีการตอบสนองที่มีลักษณะเนื้อหาที่ยอมรับไม่ได้ตามส่วนหัวยอมรับที่ส่งในคำขอเท่านั้น

ดังนั้นส่วนหัวยอมรับคำขอของคุณคือ application / json และคอนโทรลเลอร์ของคุณไม่สามารถคืนค่านั้นได้ สิ่งนี้เกิดขึ้นเมื่อไม่พบ HTTPMessageConverter ที่ถูกต้องเพื่อตอบสนองค่าส่งคืนที่มีคำอธิบายประกอบ @ResponseBody HTTPMessageConverter จะถูกลงทะเบียนโดยอัตโนมัติเมื่อคุณใช้<mvc:annotation-driven>ไลบรารีของบุคคลที่สามมิติบางอย่างใน classpath

ไม่ว่าคุณจะไม่มีห้องสมุด Jackson ที่ถูกต้องใน classpath ของคุณหรือคุณไม่ได้ใช้ <mvc:annotation-driven>คำสั่ง

ฉันจำลองสถานการณ์ของคุณสำเร็จแล้วและทำงานได้ดีโดยใช้ไลบรารีทั้งสองนี้และไม่มีheaders="Accept=*/*"คำสั่ง

  • แจ็คสันคอร์ asl-1.7.4.jar
  • jackson-mapper-asl-1.7.4.jar

ไม่นั่นไม่ใช่ปัญหาตรวจสอบคำตอบของฉัน
Jaanus

หากการกำหนดค่า HttpMessageConverters แก้ไขปัญหาของคุณด้วยตนเองการใช้ mvc: annotation-driven จะทำเช่นเดียวกับที่กำหนดค่าตัวแปลงและ HandlerAdapters (HA) โดยอัตโนมัติ โปรดทราบว่าหากคุณกำหนดค่า HA อย่างชัดเจนจะยกเลิกค่าเริ่มต้นอื่น ๆ ทั้งหมด
Villu Sepman

อืมmvcมีอะไรเหรอ? ฉันใช้<tx:annotation-driven />และ tx คือxmlns:tx="http://www.springframework.org/schema/tx"
Jaanus

1
คุณมีบางอย่างเช่น: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">และ spring-web-3.0.x และ spring-webmvc-3.0.x jars?
Villu Sepman

1
อาฉันไม่มีแผนผังตรงนั้น.. แต่ขอบคุณสิ่งนี้ช่วยฉันได้ ฉันคิดว่าtx:annotation-drivenมันเหมือนกับmvc:annotation-driveหรือ smthin
Jaanus

74

ฉันมีปัญหาเดียวกันกับ Spring 4.1.1 ล่าสุดเป็นต้นไปคุณต้องเพิ่มไหต่อไปนี้ใน pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.1.1</version>
</dependency>

ตรวจสอบให้แน่ใจว่าคุณมีโถต่อไปนี้:

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

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

406 Spring MVC Json ไม่ยอมรับตามคำขอส่วนหัว "ยอมรับ"


คำตอบนี้เป็นคำตอบยอดนิยมของ Maven และใช้งานได้ดี! ข้อยกเว้นของ Maven อาจชัดเจนมากขึ้นเกี่ยวกับสิ่งที่เกิดขึ้นภายใต้ประทุน
Cotta

4
คุณสามารถระบุที่ซึ่งเป็นเอกสารในเอกสารทางการของสปริงส์ได้หรือไม่ คนจะรู้ได้อย่างไรว่านี่คือปัญหา?
Adelin

คุณจะต้องระบุการอ้างอิงกับ jackson-databind และ jackson-mapper-asl เท่านั้นส่วนอีกสองรายการคือการอ้างอิงแบบสกรรมกริยาและจะได้รับการแก้ไขต่อไป
ถึง

1
สิ่งนี้ใช้ได้กับฉันเท่านั้นหลังจากเพิ่มการอ้างอิงสองรายการที่สอง ขอบคุณ.
DocWatson

คุณไม่ต้องการทั้งสองอย่างแน่นอน Spring จะเพิ่มMappingJacksonHttpMessageConverterสำหรับ Jackson 1 และMappingJackson2HttpMessageConverterJackson 2 แต่ละรายการดีพอที่จะทำให้เป็นอนุกรม / deserializing JSON คุณต้องการเพียงหนึ่ง (ไปกับ Jackson 2 เนื่องจากมีคุณสมบัติที่หลากหลายกว่า)
Sotirios Delimanolis

16

มีอีกกรณีหนึ่งที่จะส่งคืนสถานะนี้: หากผู้ทำแผนที่แจ็คสันไม่สามารถหาวิธีทำให้ถั่วของคุณได้ ตัวอย่างเช่นหากคุณมีวิธีการเข้าถึงสองวิธีสำหรับคุณสมบัติบูลีนเดียวกันisFoo()และgetFoo().

สิ่งที่เกิดขึ้นคือMappingJackson2HttpMessageConverterของ Spring เรียกใช้StdSerializerProviderของ Jackson เพื่อดูว่าสามารถแปลงวัตถุของคุณได้หรือไม่ ที่ด้านล่างของห่วงโซ่สาย, StdSerializerProvider._createAndCacheUntypedSerializerพ่นJsonMappingExceptionด้วยข้อความข้อมูล อย่างไรก็ตามข้อยกเว้นนี้ถูกกลืนโดยStdSerializerProvider._createAndCacheUntypedSerializerซึ่งบอก Spring ว่าไม่สามารถแปลงวัตถุได้ มีการทำงานออกจากแปลงฤดูใบไม้ผลิรายงานว่ามันไม่ได้ถูกรับส่วนหัวที่มันสามารถใช้ซึ่งแน่นอนว่าเป็นของปลอมเมื่อคุณให้มันAccept*/*

มีข้อบกพร่องสำหรับพฤติกรรมนี้ แต่ถูกปิดเนื่องจาก "ไม่สามารถทำซ้ำได้": วิธีการที่เรียกไม่ได้ประกาศว่าสามารถขว้างได้ดังนั้นการกลืนข้อยกเว้นจึงเป็นวิธีแก้ปัญหาที่เหมาะสม (ใช่นั่นคือการถากถาง) น่าเสียดายที่แจ็คสันไม่มีการบันทึกใด ๆ ... และมีความคิดเห็นมากมายใน codebase ที่ต้องการให้ทำดังนั้นฉันจึงสงสัยว่านี่ไม่ใช่ gotcha ที่ซ่อนอยู่เท่านั้น


ขอบคุณมาก! ฉันเพิ่งเริ่มใช้ Spring MVC และมีช่วงเวลาที่ยากลำบากในการหาวิธีส่งคืน JSON ทุกคนพูดถึงคำอธิบายประกอบ @ResponseBody ที่ขาดหายไปและการอ้างอิงของแจ็คสันอันเป็นสาเหตุของข้อผิดพลาด 406 ในกรณีของฉันปรากฎว่าฉันขาดวิธีการเข้าถึงสำหรับฟิลด์สาธารณะที่เป็นของวัตถุที่ฉันต้องการส่งคืนเป็น JSON
Anthony Jack

ขอบคุณ @kdgregory! ฉันลืมเพิ่ม getter / setter สำหรับฟิลด์ การเพิ่มพวกเขาช่วยแก้ไขปัญหานี้
Rubens Mariuzzo

16

ผมมีปัญหาเดียวกันฉันรันวิธีการควบคุม แต่การตอบสนองเป็นข้อผิดพลาด 406 ผมแก้ปัญหาAbstractMessageConverterMethodProcessor#writeWithMessageConvertersและพบว่าวิธีการที่ContentNegotiationManager#resolveMediaTypesมักจะให้ผลตอบแทนที่ไม่ได้รับการสนับสนุนโดยtext/html MappingJacksonHttpMessageConverterปัญหาคือว่า org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategyทำงานได้เร็วกว่าorg.springframework.web.accept.HeaderContentNegotiationStrategyและส่วนขยายของคำขอของฉัน/get-clients.htmlเป็นสาเหตุของปัญหาของฉันกับข้อผิดพลาด 406 ผมเพิ่งเปลี่ยนคำขอ URL /get-clientsไปยัง


สวัสดี Atott ฉันมีปัญหาเดียวกันและเคล็ดลับของคุณเกี่ยวกับการเปลี่ยนส่วนขยายของคำขอช่วยแก้ปัญหาของฉัน ขอบคุณมากสำหรับการแบ่งปันวิธีแก้ปัญหาของคุณ !!
jherranzm

ในกรณีของฉันมันเป็นรหัสเส้นทางที่เหลือที่มีส่วนขยายอยู่ในนั้น (ในการทดสอบ) ที่ทำให้เกิด 406 ด้วยเหตุผลเดียวกันในขณะที่ตัวควบคุมปกติทำงาน (แม้ว่าคุณจะใช้ส่วนขยายใน id พา ธ ส่วนที่เหลือ)
Jur_

9

ตรวจสอบให้แน่ใจว่ากำลังติดตาม 2 jarอยู่ในพา ธ คลาส

หากข้อใดข้อหนึ่งหรือทั้งสองอย่างหายไปข้อผิดพลาดนี้จะเกิดขึ้น

jackson-core-asl-1.9.X.jar jackson-mapper-asl-1.9.X.jar

6

ในที่สุดก็พบคำตอบจากที่นี่:

การทำแผนที่คำขอ ajax ที่เงียบสงบเพื่อฤดูใบไม้ผลิ

ฉันอ้าง:

คำอธิบายประกอบ @ RequestBody / @ ResponseBody ไม่ใช้ตัวแก้ไขมุมมองปกติพวกเขาใช้ HttpMessageConverters ของตัวเอง ในการใช้คำอธิบายประกอบเหล่านี้คุณควรกำหนดค่าตัวแปลงเหล่านี้ใน AnnotationMethodHandlerAdapter ตามที่อธิบายไว้ในข้อมูลอ้างอิง (คุณอาจต้องใช้ MappingJacksonHttpMessageConverter)


3

ตรวจสอบ<mvc:annotation-driven />ใน dispatcherservlet.xml ถ้าไม่เพิ่ม และเพิ่ม

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

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

การอ้างอิงเหล่านี้ใน pom.xml ของคุณ


2
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-base</artifactId>
    <version>2.6.3</version>
</dependency>

2
แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือเหตุผลในการแก้ปัญหาจะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
ฟองน้ำ

2

อาจไม่มีใครเลื่อนลงมาไกลขนาดนี้ แต่ไม่มีวิธีแก้ไขปัญหาข้างต้นสำหรับฉัน แต่การใช้วิธีการรับทั้งหมดของฉันpublicทำ

ฉันทิ้งการมองเห็น getter ไว้ที่ package-private แจ็คสันตัดสินใจว่าไม่พบพวกเขาและระเบิดขึ้น (ใช้การ@JsonAutoDetect(getterVisibility=NON_PRIVATE)แก้ไขเพียงบางส่วนเท่านั้น


นั่นคือปัญหาของฉัน ฉันเปลี่ยนเซ็ตเตอร์จากสาธารณะเป็นการป้องกันและแจ็คสันก็หยุดทำงาน
JuanMiguel

ปัญหาเดียวกันที่นี่ฉันใช้AbstractMap.SimpleImmutableEntryแล้วลดระดับเป็นAbstractMap.SimpleEntryแต่ยังไม่มีลูกเต๋าเนื่องจากไม่มีตัวตั้งค่าสำหรับคีย์ หายไปเกี่ยวกับเรื่องนี้
Robert Bain

2

ตรวจสอบให้แน่ใจว่าวัตถุที่ส่ง (สภาพอากาศในกรณีนี้) มี getter / setter


1

ในคอนโทรลเลอร์ไม่ควรให้คำอธิบายประกอบของเนื้อหาตอบกลับอยู่ในประเภทการส่งคืนและไม่ใช่วิธีการดังนี้:

@RequestMapping(value="/getTemperature/{id}", headers="Accept=*/*", method = RequestMethod.GET)
public @ResponseBody Weather getTemparature(@PathVariable("id") Integer id){
    Weather weather = weatherService.getCurrentWeather(id);
        return weather;
}

ฉันยังใช้ฟังก์ชัน jquery.ajax แบบ raw และตรวจสอบให้แน่ใจว่า contentType และ dataType ถูกตั้งค่าอย่างถูกต้อง

ในบันทึกอื่นฉันพบว่าการจัดการสปริงของ json ค่อนข้างมีปัญหา มันง่ายกว่าเมื่อฉันทำทุกอย่างด้วยตัวเองโดยใช้สตริงและ GSON


ตำแหน่งของ@ResponseBodyไม่ควรสำคัญ ... ฉันจะดู GSON ... แต่ยังคงต้องการให้ JSON นี้ทำงานถ้าเป็นไปได้
Jaanus

1

ตามที่ @atott กล่าวไว้ .

หากคุณเพิ่ม Jackson เวอร์ชันล่าสุดใน pom.xml ของคุณและด้วย Spring 4.0 หรือใหม่กว่าโดยใช้@ResponseBodyวิธีการดำเนินการของคุณและ@RequestMappingกำหนดค่าด้วยproduces="application/json;charset=utf-8"อย่างไรก็ตามคุณยังคงได้รับ 406 (ไม่สามารถยอมรับได้) ฉันเดาว่าคุณต้องลองใช้สิ่งนี้ใน การกำหนดค่าบริบท MVC DispatcherServlet ของคุณ:

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

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

นั่นคือวิธีที่ฉันแก้ไขปัญหาได้ในที่สุด


1

ฤดูใบไม้ผลิ 4.3.10: ฉันใช้การตั้งค่าด้านล่างเพื่อแก้ไขปัญหา

ขั้นตอนที่ 1: เพิ่มการอ้างอิงด้านล่าง

    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.6.7</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.6.7</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-core-asl</artifactId>
    <version>1.9.13</version>
</dependency>
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

ขั้นตอนที่ 2: เพิ่มด้านล่างในการกำหนดค่าบริบท MVC DispatcherServlet ของคุณ:

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

<bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false"/>
    <property name="favorParameter" value="true"/>
    <property name="ignoreAcceptHeader" value="false" />
</bean>

ตั้งแต่สปริง 3.2 ตามการกำหนดค่าเริ่มต้น favorPathExtension ถูกตั้งค่าเป็นจริงด้วยเหตุนี้หากคำขอ uri มีส่วนขยายที่เหมาะสมเช่น.htmspring จะให้ความสำคัญสำหรับส่วนขยาย ในขั้นตอนที่ 2 ฉันได้เพิ่ม contentNegotiationManager bean เพื่อแทนที่สิ่งนี้


1

ฉันประสบปัญหาเดียวกันเพราะฉันไม่มีคำอธิบายประกอบ @EnableWebMvc (การกำหนดค่าสปริงทั้งหมดของฉันใช้คำอธิบายประกอบการเทียบเท่า XML จะเป็น mvc: annotation-driven)


0

ตรวจสอบให้แน่ใจว่าคุณมีเวอร์ชันแจ็คสันที่ถูกต้องใน classpath ของคุณ


ฉันเพิ่ม jackson-all-1.8.5.jar ลงในWEB-INF/libโฟลเดอร์ของฉันแล้ว แต่ยังคงมีปัญหาเดิม: /
Jaanus

0

ตรวจสอบตามที่ @joyfun ทำสำหรับแจ็คสันเวอร์ชันที่ถูกต้อง แต่ตรวจสอบส่วนหัวของเราด้วย ... ยอมรับ/อาจไม่ถูกส่งโดยไคลเอนต์ ... ใช้ firebug หรือเทียบเท่าเพื่อตรวจสอบสิ่งที่คำขอของคุณส่งจริง ฉันคิดว่าแอตทริบิวต์ส่วนหัวของคำอธิบายประกอบ / อาจ / กำลังตรวจสอบตัวอักษรแม้ว่าฉันจะไม่แน่ใจ 100% ก็ตาม


ฉันเพิ่มส่วนหัวจาก firebug ไปยังโพสต์หลัก พวกเขาโอเคไหม?
Jaanus

0

อื่น ๆ จากนั้นปัญหาที่ชัดเจนฉันมีอีกปัญหาหนึ่งที่ฉันไม่สามารถแก้ไขได้ไม่ว่าจะรวม JARs การพึ่งพาและคำอธิบายประกอบที่เป็นไปได้ทั้งหมดใน Spring servlet ในที่สุดฉันก็พบว่าฉันมีนามสกุลไฟล์ที่ไม่ถูกต้องโดยที่ฉันหมายความว่าฉันมี servlet ที่แยกจากกันสองรายการที่ทำงานในคอนเทนเนอร์เดียวกันและฉันจำเป็นต้องจับคู่กับนามสกุลไฟล์ที่แตกต่างกันโดยที่นามสกุลหนึ่งคือ ".do" และอีกอันที่ใช้สำหรับการสมัครรับข้อมูลจะถูกตั้งชื่อแบบสุ่ม " ย่อย ". ดีทั้งหมด แต่ SUB เป็นนามสกุลไฟล์ที่ถูกต้องโดยปกติจะใช้สำหรับไฟล์คำบรรยายภาพยนตร์ดังนั้น Tomcat จึงแทนที่ส่วนหัวและส่งคืนบางสิ่งเช่น "text / x-dvd.sub ... " ดังนั้นทุกอย่างก็ใช้ได้ดี แต่แอปพลิเคชันคาดหวัง JSON แต่ได้รับคำบรรยาย ดังนั้นสิ่งที่ฉันต้องทำคือเปลี่ยนการแมปในweb.xmlไฟล์ที่ฉันเพิ่ม:

<mime-mapping>
    <extension>sub</extension>
    <mime-type>application/json</mime-type>
</mime-mapping>

0

ฉันมีปัญหาเดียวกัน แต่น่าเสียดายที่ไม่ใช่วิธีแก้ปัญหาที่นี่แก้ปัญหาของฉันได้เนื่องจากปัญหาของฉันเป็นสิ่งที่อยู่ในคลาสอื่น

ก่อนอื่นฉันตรวจสอบว่าการอ้างอิงทั้งหมดอยู่ในสถานที่ตามที่แนะนำโดย @bekur จากนั้นฉันตรวจสอบคำขอ / การตอบสนองที่เดินทางจากไคลเอนต์ไปยังเซิร์ฟเวอร์ส่วนหัวทั้งหมดอยู่ในตำแหน่งที่ Jquery ตั้งไว้อย่างเหมาะสม จากนั้นฉันตรวจสอบRequestMappingHandlerAdapter MessageConvertersและทั้ง 7 คนเข้าที่แล้วฉันเริ่มเกลียดฤดูใบไม้ผลิจริงๆ! จากนั้นฉันได้อัปเดตจาก Spring 4.0.6.RELEASEเป็น4.2.0.RELEASEฉันได้รับคำตอบอื่นที่ไม่ใช่ข้างต้น มันเป็นRequest processing failed; nested exception is java.lang.IllegalArgumentException: No converter found for return value of type

นี่คือวิธีการควบคุมของฉัน

  @RequestMapping(value = "/upload", method = RequestMethod.POST,produces = "application/json")
    public ResponseEntity<UploadPictureResult> pictureUpload(FirewalledRequest initialRequest) {

        DefaultMultipartHttpServletRequest request = (DefaultMultipartHttpServletRequest) initialRequest.getRequest();

        try {
            Iterator<String> iterator = request.getFileNames();

            while (iterator.hasNext()) {
                MultipartFile file = request.getFile(iterator.next());
                session.save(toImage(file));
            }
        } catch (Exception e) {
            return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(),HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<UploadPictureResult>(new UploadPictureResult(), HttpStatus.OK);
    } 




    public class UploadPictureResult extends WebResponse{

    private List<Image> images;

    public void setImages(List<Image> images) {
        this.images = images;
    }
}






    public class WebResponse implements Serializable {


    protected String message;

    public WebResponse() {
    }

    public WebResponse(String message) {

        this.message = message;
    }


    public void setMessage(String message) {
        this.message = message;
    }
}

วิธีแก้ปัญหาคือทำให้ UploadPictureResult ไม่ขยาย WebResponse

ด้วยเหตุผลบางประการ spring ไม่สามารถระบุวิธีการแปลง UploadPictureReslt เมื่อขยาย WebResponse


0
<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.0</version>
    </dependency>

ฉันไม่ได้ใช้การพิสูจน์ตัวตน ssl และ jackson-databind นี้มี jackson-core.jar และ jackson-databind.jar จากนั้นเปลี่ยนเนื้อหา RequestMapping ดังนี้:

@RequestMapping(value = "/id/{number}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET)
public @ResponseBody Customer findCustomer(@PathVariable int number){
    Customer result = customerService.findById(number);
    return result;
}

ความสนใจ: หากผลงานของคุณไม่ใช่ประเภท "application / json" และฉันไม่สังเกตเห็นสิ่งนี้และได้รับข้อผิดพลาด 406 ความช่วยเหลือนี้จะช่วยคุณได้


0

ตรวจสอบหัวข้อนี้ spring mvc restcontroller ส่งคืนสตริง json p / s: คุณควรเพิ่มการกำหนดค่าการแมปแจ็ค son ในคลาส WebMvcConfig ของคุณ

@Override protected void configureMessageConverters( List<HttpMessageConverter<?>> converters) { // put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON converters.add(new MappingJackson2HttpMessageConverter()); // and probably needs a string converter too for text/plain content-type strings to be properly handled converters.add(new StringHttpMessageConverter()); }


0

นี่คือคำตอบสำหรับการอัปเดตสำหรับ springVersion = 5.0.3.RELEASE

คำตอบข้างต้นจะใช้ได้เฉพาะรุ่น springVersion <4.1 ที่เก่ากว่าเท่านั้น สำหรับฤดูใบไม้ผลิล่าสุดคุณต้องเพิ่มการอ้างอิงต่อไปนี้ในไฟล์ gradle:

compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: fasterxmljackson
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: fasterxmljackson

fasterxmljackson=2.9.4

ฉันหวังว่านี่จะเป็นประโยชน์สำหรับผู้ที่ใช้สปริงเวอร์ชันล่าสุด


-3

คุณสามารถลบองค์ประกอบส่วนหัวใน @RequestMapping และลอง ..

ชอบ


@RequestMapping(value="/getTemperature/{id}", method = RequestMethod.GET)

ฉันเดาว่าฤดูใบไม้ผลิมี 'มีการตรวจสอบ' มากกว่าการจับคู่แบบตรงทั้งหมดสำหรับส่วนหัวที่ยอมรับ แต่ถึงกระนั้นก็ควรลองลบองค์ประกอบส่วนหัวและตรวจสอบ


ฉันลบออกแล้วแต่ยังมีข้อผิดพลาด Btw เมื่อฉันดูบันทึก Tomcat จากนั้นแบบสอบถามด้วยสิ่งนี้คือweatherService.getCurrentWeather(id);"เปิดใช้งาน" ... ดังนั้นจึงมีบางอย่างทำงาน ... เป็นไปได้ไหมที่ 406 ปรากฏขึ้นและ Hibernate SQL select ทำงานในเวลาเดียวกัน?
Jaanus

โปรดลองอันนี้ควรใช้งานได้ เพิ่มคำอธิบายประกอบนี้ใน controller @RequestMapping (method = RequestMethod.GET, headers = {"Accept = text / xml, application / json"})
sats
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.