Java SpringWebMVC控制器接受“.com/”,但拒绝url中的“.com”,并抛出406错误

Java SpringWebMVC控制器接受“.com/”,但拒绝url中的“.com”,并抛出406错误,java,spring,Java,Spring,我是新来的springwebmvcplz请容忍我,由于我对这个主题缺乏理解,我无法准确地发布我要问的问题。我只能说springmvc文件扩展名 继承了maven+springwebmvc5.1.2.版本project 在linux平台上部署mvn-buildedfooapp.war到tomcat 8.5.58 我的问题是当我在浏览器中为/mail/{address}端点调用RESTAPI时 案例1) 如果uri末尾没有/,它将返回http状态406-根据请求中接收到的主动协商标头字段,目标资

我是新来的
springwebmvc
plz请容忍我,由于我对这个主题缺乏理解,我无法准确地发布我要问的问题。我只能说
springmvc文件扩展名

  • 继承了
    maven+springwebmvc5.1.2.版本
    project
  • linux
    平台上部署
    mvn-builded
    fooapp.war到
    tomcat 8.5.58
我的问题是当我在浏览器中为
/mail/{address}
端点调用RESTAPI时

案例1)

如果uri末尾没有
/
,它将返回
http状态406-根据请求中接收到的主动协商标头字段,目标资源没有用户代理可以接受的当前表示,并且服务器不愿意提供默认表示。

http://localhost:<port>/fooapp/mail/john@bar.com
我无法从不了解其原因开始,制定一个恰当的问题,但我尽了最大努力从
www
中寻找线索。我找到了许多线索,但它们吸引了我的目光:

这就是我试过的

web.xml
中,首先将
/
替换为
/*
,用于
url模式

<servlet>
    <servlet-name>fooapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:fooapp.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>fooapp</servlet-name>        
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
</bean>
以及
FooController.java
的精简版

@RestController
@RequestMapping("/mail/{address}")
public final class FooController {
    
@RequestMapping(method = RequestMethod.GET, produces = "application/json")
public String doSomething(
    @PathVariable("address") String address, HttpServletResponse response) {         
    // execute code...
    return josnData;
}
不知道我在做什么,我的尝试并没有改变结果。为什么对
.com
.com/
的处理不同?以及如何使用
.com
获得正确的响应

更新

我可能发现了一个线索: 我会试试它说什么

有了^建议,我能够避免
http状态406
,但是当
FooController
使用
电子邮件地址时,它会删除
.com
,这样与eamil地址相关的数据就不会返回

我尝试的建议是在
fooapp.xml
中添加以下内容

<servlet>
    <servlet-name>fooapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:fooapp.xml
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>fooapp</servlet-name>        
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />

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

找到了解决方案

在这篇文章中:


通过在控制器中添加
mail/{address:.+}
以及^solution一起修复了问题。

我将尝试将端点规范,
“/mail/{address}”
从类注释移动到方法注释。我认为现在的情况是,它希望该方法向url的路径中添加一些内容,因此需要查看结尾处的
/
。Ty@Steve以获取您的时间和建议。我尝试将
/mail/{address}
移动到该方法,但不幸的是,当
FooController
消耗日志文件中的完整电子邮件地址时,
.com
被切断,我看到了相同的结果。。。虽然我逐渐理解了这个问题的原因,但我还是很感激您的建议。我会尝试将端点规范,
“/mail/{address}”
从类注释移动到方法注释。我认为现在的情况是,它希望该方法向url的路径中添加一些内容,因此需要查看结尾处的
/
。Ty@Steve以获取您的时间和建议。我尝试将
/mail/{address}
移动到该方法,但不幸的是,当
FooController
消耗日志文件中的完整电子邮件地址时,
.com
被切断,我看到了相同的结果。。。虽然我逐渐了解这个问题的原因,但我还是很感激你的建议。。