Java 客户端发送的请求语法不正确,请列出复选框
我在提交表单时遇到错误: 错误400:客户端发送的请求在语法上不正确 我在带有Servlet3.0的Tomcat7中使用Hibernate4、Spring3和JSP页面 我得到了一个扩展BaseEntity的Order类(BaseEntity得到了自动生成的uuid成员): 但它永远不会到达那里 我向wireshark查询了HTML POST请求中发送的内容,得到了以下信息:Java 客户端发送的请求语法不正确,请列出复选框,java,spring,hibernate,jsp,tomcat7,Java,Spring,Hibernate,Jsp,Tomcat7,我在提交表单时遇到错误: 错误400:客户端发送的请求在语法上不正确 我在带有Servlet3.0的Tomcat7中使用Hibernate4、Spring3和JSP页面 我得到了一个扩展BaseEntity的Order类(BaseEntity得到了自动生成的uuid成员): 但它永远不会到达那里 我向wireshark查询了HTML POST请求中发送的内容,得到了以下信息: selectedAdditionalOptions=ae396f42-843c-454d-a573-85e71c367
selectedAdditionalOptions=ae396f42-843c-454d-a573-85e71c36709d&selectedAdditionalOptions=962e0766-5e56-4490-bc50-d4f41272c77e&_selectedAdditionalOptions=on
我在log4j文件中发现以下错误:
013-11-04 20:46:56 DEBUG DispatcherServlet:823 - DispatcherServlet with name 'appServlet' processing POST request for [/menuapp/order/create]
2013-11-04 20:46:56 DEBUG RequestMappingHandlerMapping:220 - Looking up handler method for path /order/create
2013-11-04 20:46:56 DEBUG RequestMappingHandlerMapping:227 - Returning handler method [public java.lang.String com.openu.menuapp.controller.OrderController.save(org.springframework.ui.Model,com.openu.menuapp.entity.Order)]
2013-11-04 20:46:56 DEBUG DefaultListableBeanFactory:246 - Returning cached instance of singleton bean 'orderController'
2013-11-04 20:46:56 DEBUG BeanUtils:443 - No property editor [com.openu.menuapp.entity.AdditionalOptionEditor] found for type com.openu.menuapp.entity.AdditionalOption according to 'Editor' suffix convention
2013-11-04 20:46:56 DEBUG ExceptionHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.openu.menuapp.controller.OrderController.save(org.springframework.ui.Model,com.openu.menuapp.entity.Order)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'order' on field 'selectedAdditionalOptions': rejected value [962e0766-5e56-4490-bc50-d4f41272c77e]; codes [typeMismatch.order.selectedAdditionalOptions,typeMismatch.selectedAdditionalOptions,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [order.selectedAdditionalOptions,selectedAdditionalOptions]; arguments []; default message [selectedAdditionalOptions]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'selectedAdditionalOptions'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.openu.menuapp.entity.AdditionalOption] for property 'selectedAdditionalOptions[0]': no matching editors or conversion strategy found]
2013-11-04 20:46:56 DEBUG ResponseStatusExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.openu.menuapp.controller.OrderController.save(org.springframework.ui.Model,com.openu.menuapp.entity.Order)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'order' on field 'selectedAdditionalOptions': rejected value [962e0766-5e56-4490-bc50-d4f41272c77e]; codes [typeMismatch.order.selectedAdditionalOptions,typeMismatch.selectedAdditionalOptions,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [order.selectedAdditionalOptions,selectedAdditionalOptions]; arguments []; default message [selectedAdditionalOptions]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'selectedAdditionalOptions'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.openu.menuapp.entity.AdditionalOption] for property 'selectedAdditionalOptions[0]': no matching editors or conversion strategy found]
2013-11-04 20:46:56 DEBUG DefaultHandlerExceptionResolver:132 - Resolving exception from handler [public java.lang.String com.openu.menuapp.controller.OrderController.save(org.springframework.ui.Model,com.openu.menuapp.entity.Order)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'order' on field 'selectedAdditionalOptions': rejected value [962e0766-5e56-4490-bc50-d4f41272c77e]; codes [typeMismatch.order.selectedAdditionalOptions,typeMismatch.selectedAdditionalOptions,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [order.selectedAdditionalOptions,selectedAdditionalOptions]; arguments []; default message [selectedAdditionalOptions]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'selectedAdditionalOptions'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.openu.menuapp.entity.AdditionalOption] for property 'selectedAdditionalOptions[0]': no matching editors or conversion strategy found]
2013-11-04 20:46:56 DEBUG DispatcherServlet:999 - Null ModelAndView returned to DispatcherServlet with name 'appServlet': assuming HandlerAdapter completed request handling
2013-11-04 20:46:56 DEBUG DispatcherServlet:966 - Successfully completed request
我无法回答自己的问题,所以我在这里写下答案:
好的,问题是Uuid作为字符串转换成AdditionalOption对象 因此,我将以下绑定添加到我的控制器:
@Autowired
private AdditionalOptionConvertor additionalOptionConvertor;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(AdditionalOption.class, additionalOptionConvertor);
}
@Autowired
private AdditionalOptionConvertor additionalOptionConvertor;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(AdditionalOption.class, additionalOptionConvertor);
}
当AdditionalOptionConvertor是一个自动连接的服务时,如下所示:
@Entity
@Table (name = "additional_options")
public class AdditionalOption extends BaseEntity {
@Column (nullable = false)
protected String name;
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "selectedAdditionalOptions")
private Set<Order> orders = new HashSet<Order>();
/**
* Constructor
*/
public AdditionalOption()
{
super("");
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String save(Model model, @ModelAttribute Order order) {
orderService.saveOrUpdate(order);
model.addAttribute("saved", "success");
return "order";
}
@Service("additionalOptionConvertor")
public class AdditionalOptionConvertor extends BaseConvertor<AdditionalOption>
{
@Autowired
protected AdditionalOptionService service;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
baseService = service;
super.setAsText(text);
}
}
public abstract class BaseConvertor<T extends BaseEntity> extends PropertyEditorSupport
{
protected BaseEntityService baseService;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
T value = baseService.findByUUID(text);
setValue(value);
}
@SuppressWarnings("unchecked")
@Override
public String getAsText()
{
T d = (T) getValue();
return d != null ? String.valueOf(d.getUuid()) : "";
}
}
@Service("additionalOptionConvertor")
public class AdditionalOptionConvertor extends BaseConvertor<AdditionalOption>
{
@Autowired
protected AdditionalOptionService service;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
baseService = service;
super.setAsText(text);
}
}
public abstract class BaseConvertor<T extends BaseEntity> extends PropertyEditorSupport
{
protected BaseEntityService baseService;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
T value = baseService.findByUUID(text);
setValue(value);
}
@SuppressWarnings("unchecked")
@Override
public String getAsText()
{
T d = (T) getValue();
return d != null ? String.valueOf(d.getUuid()) : "";
}
}
@服务(“附加选项转换器”)
公共类附加选项转换器扩展BaseConvertor
感谢帮助人员好的,问题是Uuid作为字符串转换为AdditionalOption对象
因此,我将以下绑定添加到我的控制器:
@Autowired
private AdditionalOptionConvertor additionalOptionConvertor;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(AdditionalOption.class, additionalOptionConvertor);
}
@Autowired
private AdditionalOptionConvertor additionalOptionConvertor;
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(AdditionalOption.class, additionalOptionConvertor);
}
当AdditionalOptionConvertor是一个自动连接的服务时,如下所示:
@Entity
@Table (name = "additional_options")
public class AdditionalOption extends BaseEntity {
@Column (nullable = false)
protected String name;
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "selectedAdditionalOptions")
private Set<Order> orders = new HashSet<Order>();
/**
* Constructor
*/
public AdditionalOption()
{
super("");
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
}
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String save(Model model, @ModelAttribute Order order) {
orderService.saveOrUpdate(order);
model.addAttribute("saved", "success");
return "order";
}
@Service("additionalOptionConvertor")
public class AdditionalOptionConvertor extends BaseConvertor<AdditionalOption>
{
@Autowired
protected AdditionalOptionService service;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
baseService = service;
super.setAsText(text);
}
}
public abstract class BaseConvertor<T extends BaseEntity> extends PropertyEditorSupport
{
protected BaseEntityService baseService;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
T value = baseService.findByUUID(text);
setValue(value);
}
@SuppressWarnings("unchecked")
@Override
public String getAsText()
{
T d = (T) getValue();
return d != null ? String.valueOf(d.getUuid()) : "";
}
}
@Service("additionalOptionConvertor")
public class AdditionalOptionConvertor extends BaseConvertor<AdditionalOption>
{
@Autowired
protected AdditionalOptionService service;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
baseService = service;
super.setAsText(text);
}
}
public abstract class BaseConvertor<T extends BaseEntity> extends PropertyEditorSupport
{
protected BaseEntityService baseService;
@Override
public void setAsText(String text) throws IllegalArgumentException
{
T value = baseService.findByUUID(text);
setValue(value);
}
@SuppressWarnings("unchecked")
@Override
public String getAsText()
{
T d = (T) getValue();
return d != null ? String.valueOf(d.getUuid()) : "";
}
}
@服务(“附加选项转换器”)
公共类附加选项转换器扩展BaseConvertor
感谢帮助者从服务器角度看,没有足够的信息来了解您是否发送了正确的帖子,因为这就是HTTP 400的含义。。。请求不正确。。我建议您直接通过HTTP测试仪发送您从wireshark收到的请求,以查看您的语法是否正确。嗨,我添加了服务器日志。