为什么我的 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
,这应该有效。
我有一个 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
,这应该有效。