springjson请求获取406(不可接受)

wpx232ag  于 2021-07-23  发布在  Java
关注(0)|答案(22)|浏览(374)

这是我的javascript:

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错误,但hibernate查询同时工作。每当我在dropbox中更改选择时,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=?

有什么问题吗?有两个类似的问题,所以之前,我尝试了所有接受的提示那里,但他们没有工作,我猜。。。
有什么建议吗?请随意提问。。。

ih99xse1

ih99xse11#

在控制器中,响应主体注解不应该在返回类型上而不是方法上,如下所示:

@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函数,并确保contenttype和datatype设置正确。
另一方面,我发现spring对json的处理相当有问题。当我自己用字符串和gson来做这一切时,就容易多了。

sczxawaw

sczxawaw2#

能否删除@requestmapping中的headers元素并尝试。。
就像

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

我猜spring对accept头执行的是“包含检查”,而不是完全匹配。但是,仍然值得尝试删除headers元素并进行检查。

4ngedf3f

4ngedf3f3#

这是springversion=5.0.3.release的更新答案。
以上答案只适用于springversion<4.1版本。对于最新的spring,您必须在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

我希望这将有助于世卫组织使用最新的 Spring 版本。

iyr7buue

iyr7buue4#

检查这根线。spring mvc restcontroller return json string p/s:应该将jacksonMap配置添加到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()); }

izkcnapc

izkcnapc5#

<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错误,那么help this可以帮助您解决这个问题。

w80xi6nr

w80xi6nr6#

我也有同样的问题,不幸的是,这里的解决方案解决了我的问题,因为我的问题在另一个班级里。
我首先检查了所有依赖项是否都按照@bekur的建议就位,然后检查了从客户机到服务器的请求/响应所有头是否就位,jquery是否正确设置了所有头。然后我查了一下
RequestMappingHandlerAdapter MessageConverters 而且7个都到位了,我真的开始讨厌Spring了!然后我更新到从 Spring 4.0.6.RELEASE4.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在扩展webresponse时无法确定如何转换uploadpicturereslt

zphenhs4

zphenhs47#

除了显而易见的问题之外,我还有另外一个问题无法解决,不管springservlet中包含了所有可能的jar、依赖项和注解。最后我发现我的文件扩展名不对,我的意思是我有两个单独的servlet运行在同一个容器中,我需要Map到不同的文件扩展名,其中一个是“.do”,另一个用于订阅的文件扩展名是随机命名的“.sub”。除了sub以外,其他都是有效的文件扩展名,通常用于电影字幕文件,因此tomcat重写了头文件并返回类似于“text/x-dvd.sub”的内容。所以一切都很好,但是应用程序需要json,但是得到了字幕,因此我所要做的就是更改我的文件中的Map web.xml 我添加的文件:

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

lh80um4z8#

像@joyfun那样检查jackson的正确版本,同时检查我们的标题。。。接受/不可由客户端传输。。。使用firebug或等效工具检查get请求实际发送的内容。我认为annotation/may/的headers属性正在检查文本,尽管我不是100%确定。

guykilcj

guykilcj9#

确保在类路径中有正确的jackson版本

hi3rlvi2

hi3rlvi210#

Spring4.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>

自Spring3.2以来,根据默认配置,favorpathextension设置为true,因此如果请求uri具有任何适当的扩展,如 .htm spring将优先考虑延期。在步骤2中,我添加了contentnegotiationmanager bean来覆盖它。

yyyllmsg

yyyllmsg11#

正如@atott提到的。
如果您在pom.xml中添加了最新版本的jackson,并且使用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>

这就是我最终解决问题的方法。

kwvwclae

kwvwclae12#

406不可接受
请求标识的资源只能根据请求中发送的accept头生成具有不可接受的内容特征的响应实体。
因此,您的请求接受头是application/json,而您的控制器无法返回该头。当找不到正确的httpmessageconverter以满足@responsebody注解的返回值时,就会发生这种情况。当您使用 <mvc:annotation-driven> ,给定类路径中的某些三维聚会库。
要么你的类路径中没有正确的jackson库,要么你没有使用 <mvc:annotation-driven> 指令。
我成功地复制了您的场景,使用这两个库和 headers="Accept=*/*" 指令。
jackson-core-asl-1.7.4.jar
jackson-mapper-asl-1.7.4.jar

31moq8wy

31moq8wy13#

我遇到了同样的问题,因为我缺少@enablewebmvc注解(我的所有spring配置都是基于注解的,与xml等价的是mvc:annotation-driven)

t5fffqht

t5fffqht14#

可能没有人向下滚动到现在,但是上面的解决方案都没有为我修复它,而是使我所有的getter方法 public 做。
我把getter的可见性留给了package private;Jackson决定找不到他们就爆炸了(使用 @JsonAutoDetect(getterVisibility=NON_PRIVATE) 只是部分修复了。

wf82jlnq

wf82jlnq15#

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

相关问题