为什么我的 Controller 有时会被绕过?

Why is my Controller being bypassed sometimes?

我有一个 spring 网络项目,带有一个用于编辑客户详细信息的控制器。

@Controller
@RequestMapping("/customers")
public class CustomerController {
    @Autowired
    CustomerService customerService;

    @RequestMapping(value = {"/", ""}, method = RequestMethod.PUT)
    public AjaxResponse updateCustomer(
        @RequestBody Customer customer
        ) {
// Update the customer in the service
    }
}

ajax调用的javascript

const customer = {/* get customer info from page */};
$.ajax({
    url: `${contextPath}/customers`
    , method: "POST"
    , accept: "application/json"
    , contentType: "application/json"
    , dataType: "json"
    , data: JSON.stringify(customer)
    , beforeSend: function() {
    }
    , complete: function() {
    }
    , success: function(ajaxResponse) {
        if (ajaxResponse.status !== "OK") {
            return;
        }
// update all references on the screen
    }
    , error: function(xhr, status, error) {
// log error
    }
});

请注意控制器正在使用 RequestMethod.PUT 而 ajax 正在使用 , method: "POST" 这给了我错误 POST http://localhost:8080/hub/customers 405 (Method Not Allowed) 并且响应 Header 包含 Allow: PUT,这完全没问题。它告诉我请求将发送到我的控制器。

如果我将 ajax 更改为 , method: "PUT",我会得到 PUT http://localhost:8080/hub/customers 404 (Not Found)。当我检查响应是 /hub/WEB-INF/views/customers.jsp The requested resource is not available. 时,请注意 /views/customers.jsp 这似乎来自 InternalResourceViewResolver。

来自我的 dispatcher-servlet.xml

<beans:bean id="tilesViewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <beans:property name="viewClass">
        <beans:value>org.springframework.web.servlet.view.tiles3.TilesView
        </beans:value>
    </beans:property>
    <beans:property name="order">
        <beans:value>1</beans:value>
    </beans:property>
</beans:bean>

<beans:bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix">
        <beans:value>/WEB-INF/views/</beans:value>
    </beans:property>
    <beans:property name="suffix">
        <beans:value>.jsp</beans:value>
    </beans:property>
    <beans:property name="order">
        <beans:value>#{tilesViewResolver.order+1}</beans:value>
    </beans:property>
</beans:bean>

所以看起来当我 ajax 方法和 RequestMethod 不一样时,它会转到 UrlBasedViewResolver,但是当它们相同时,它会绕过它并转到 InternalResourceViewResolver。我不明白为什么。

ajax 调用通常适合处理像 JSON、XML 这样的响应而不是视图。 因此,如果您将控制器从 @Controller 更改为 @RestContoller,这应该有效。