Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring MVC错误:无法将java.lang.String类型的属性值转换为所需类型_Spring_Spring Mvc_Spring Data_Spring Data Jpa - Fatal编程技术网

Spring MVC错误:无法将java.lang.String类型的属性值转换为所需类型

Spring MVC错误:无法将java.lang.String类型的属性值转换为所需类型,spring,spring-mvc,spring-data,spring-data-jpa,Spring,Spring Mvc,Spring Data,Spring Data Jpa,我不能放过这个例外: Failed to convert property value of type java.lang.String to required type com.company.springdemo.entity.Product for property productId; nested exception is java.lang.IllegalStateException: Cannot convert value of type java.lang.String to

我不能放过这个例外:

Failed to convert property value of type java.lang.String to required type com.company.springdemo.entity.Product for property productId; nested exception is java.lang.IllegalStateException: Cannot convert value of type java.lang.String to required type com.company.springdemo.entity.Product for property productId: no matching editors or conversion strategy found 
订单模式

@Entity
@Table(name = "orders") // naming the table only order, will throw exception
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "order_id")
private Integer orderId;


@OneToOne(cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name = "product_id")
private Product productId;

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name = "client_id")
private Client client;

....
@Entity
@Table(name = "product")
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "product_id")
private Integer id;

@Column(name = "product_name")
private String productName;

@Column(name = "product_serial")
private String productSerial;

...
@Entity
@Table(name = "clients")
public class Client {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@NotEmpty
@Column(name = "first_name")
private String firstName;

@NotEmpty
@Column(name = "last_name")
private String lastName;

@NotEmpty
@Email
@Column(name = "email")
private String email;

@NotEmpty
@Column(name = "location")
private String location;

@OneToMany(mappedBy = "client",cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Order> orders;
产品型号

@Entity
@Table(name = "orders") // naming the table only order, will throw exception
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "order_id")
private Integer orderId;


@OneToOne(cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name = "product_id")
private Product productId;

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name = "client_id")
private Client client;

....
@Entity
@Table(name = "product")
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "product_id")
private Integer id;

@Column(name = "product_name")
private String productName;

@Column(name = "product_serial")
private String productSerial;

...
@Entity
@Table(name = "clients")
public class Client {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@NotEmpty
@Column(name = "first_name")
private String firstName;

@NotEmpty
@Column(name = "last_name")
private String lastName;

@NotEmpty
@Email
@Column(name = "email")
private String email;

@NotEmpty
@Column(name = "location")
private String location;

@OneToMany(mappedBy = "client",cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Order> orders;
客户机型号

@Entity
@Table(name = "orders") // naming the table only order, will throw exception
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "order_id")
private Integer orderId;


@OneToOne(cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name = "product_id")
private Product productId;

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
@JoinColumn(name = "client_id")
private Client client;

....
@Entity
@Table(name = "product")
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "product_id")
private Integer id;

@Column(name = "product_name")
private String productName;

@Column(name = "product_serial")
private String productSerial;

...
@Entity
@Table(name = "clients")
public class Client {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@NotEmpty
@Column(name = "first_name")
private String firstName;

@NotEmpty
@Column(name = "last_name")
private String lastName;

@NotEmpty
@Email
@Column(name = "email")
private String email;

@NotEmpty
@Column(name = "location")
private String location;

@OneToMany(mappedBy = "client",cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Order> orders;
@实体
@表(name=“客户”)
公共类客户端{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有整数id;
@空空如也
@列(name=“first_name”)
私有字符串名;
@空空如也
@列(name=“last_name”)
私有字符串lastName;
@空空如也
@电子邮件
@列(name=“email”)
私人字符串电子邮件;
@空空如也
@列(name=“location”)
私有字符串位置;
@OneToMany(mappedBy=“client”,cascade=CascadeType.ALL,fetch=FetchType.EAGER)
私人名单订单;
控制器,我在其中保存与相关客户和产品的订单

@PostMapping("add")
public ModelAndView addOrder( @Validated @ModelAttribute("ords") Order order, BindingResult bindingResult ){

    if (bindingResult.hasErrors()) {
        System.out.println("Having errors: " + bindingResult.getAllErrors());

        Iterable<Product> products = productService.listProducts();
        Iterable<Client> clients = clientService.listClients();


        System.out.println("Error "+ bindingResult.getAllErrors());

        ModelAndView mv = new ModelAndView("orders/add-order");

        mv.addObject("products",products);
        mv.addObject("clients",clients);

        return mv;
    }

    try {
        orderService.saveOrder(order);
    } catch (Exception e) {
        e.printStackTrace();
    }

    ModelAndView mv = new ModelAndView("redirect:list");

    return mv;
}
@PostMapping(“添加”)
公共模型和视图添加顺序(@Validated@modeldattribute(“ords”)顺序,BindingResult BindingResult){
if(bindingResult.hasErrors()){
System.out.println(“有错误:+bindingResult.getAllErrors());
Iterable products=productService.listProducts();
Iterable clients=clientService.listClients();
System.out.println(“错误”+bindingResult.getAllErrors());
ModelAndView mv=新的ModelAndView(“订单/添加订单”);
mv.addObject(“产品”,产品);
mv.addObject(“客户机”,客户机);
返回mv;
}
试一试{
orderService.saveOrder(订单);
}捕获(例外e){
e、 printStackTrace();
}
ModelAndView mv=新ModelAndView(“重定向:列表”);
返回mv;
}
最后,我的JSP表单查看页面

<form:form action="add" method="post" modelAttribute="ords">

    <label for="productId" >Product Id</label>
    <form:select path="productId" >
        <c:forEach var="product" items="${products}">
            <form:option value="${product.id}">${product.productName}</form:option>
        </c:forEach>
    </form:select>

    <form:errors path="productId"/>

    <br>

    <label for="client" >Client Id</label>
    <form:select path="client" >
        <c:forEach var="client" items="${clients}">
            <form:option value="${client.id}">${client.id} - ${client.lastName}</form:option>
        </c:forEach>
    </form:select>

    <form:errors path="client"/>

    <br>

    <input type="submit" value="Place Order">

</form:form>

产品Id
${product.productName}

客户端Id ${client.id}-${client.lastName}

我做错了什么?

productId
字段实际上是一个
Product
对象,而不是ID(String/int)。您需要JSP使用
path=“productId.ID”
而不是
path=“productId”

(尽管我还建议您也重命名字段
product
,而不是
productId



我想您在
上也会遇到同样的问题。
productId
字段实际上是
Product
对象,而不是ID(String/int)。您需要JSP使用
path=“productId.ID”
而不是
path=“productId”

(尽管我还建议您也重命名字段
product
,而不是
productId



我认为您在
上也会遇到同样的问题。

您很可能需要构建一个转换器类,例如:

@Component("facilityConverter")
public class FacilityConverter implements Converter<String, Facility>
{
    @Autowired
    FacilityService facilityService;

    @Override
    public Facility convert(String id) 
    {
        return facilityService.findById(Integer.parseInt(id));
    }
}
然后,您的实体将从下拉选择中正确映射。此外,这可能不是您的问题的一部分,但您可以这样构建您的下拉列表:

<form:select name="linkedInterface" path="linkedInterface" id="linkedInterface">
                        <form:options items="${interfaces}" itemLabel="name" itemValue="id"/>
                    </form:select>

您很可能需要构建这样的转换器类:

@Component("facilityConverter")
public class FacilityConverter implements Converter<String, Facility>
{
    @Autowired
    FacilityService facilityService;

    @Override
    public Facility convert(String id) 
    {
        return facilityService.findById(Integer.parseInt(id));
    }
}
然后,您的实体将从下拉选择中正确映射。此外,这可能不是您的问题的一部分,但您可以这样构建您的下拉列表:

<form:select name="linkedInterface" path="linkedInterface" id="linkedInterface">
                        <form:options items="${interfaces}" itemLabel="name" itemValue="id"/>
                    </form:select>


路径中的值是对Bean属性的引用,因此,我们不从路径值中提取值,而是从下一行-->
中提取值,其中
产品
这里是实际的对象,我们通过说
产品.id
来引用它的id,这是说它不能从
字符串
转换为
产品
。HTML
只提交一个字符串值,因此您必须为Spring提供一个与字符串兼容的字段的路径。哪个
productId
不是。接下来的几行是您枚举要添加到
中的HTML
元素,但提交给Spring的仍然只是一个字符串值。查看HTML源代码以获取更多信息加载页面后,查看提交的HTTP请求(如果我不理解的话)。我按照你说的做了……现在,另一个错误弹出:
由以下原因引起:javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:distached entity传递给persistent:com.company.springdemo.entity.Client
您可能需要另一个问题n对于这一个,另一个回答:-)我不知道Hibernate。路径中的值是对Bean属性的引用,因此,我们不从路径值中提取值,而是从下一行-->
中提取,
产品
这里是实际对象,我们通过说
产品.id
来引用它的id,它说它不能从
String
转换为
Product
。HTML
只提交一个字符串值,因此您必须为Spring提供一个与字符串兼容的字段的路径。哪个
Product productId
不是。接下来的几行是枚举要添加到
的HTML
元素,但仍然是提交给Spring的内容只有一个字符串值。加载后查看页面的HTML源代码,如果我不理解,请查看提交的HTTP请求。我按照您所说的做了……现在,另一个错误弹出:
由以下原因引起:javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:传递给persistent的分离实体:com.company.springdemo.entity.Client
你可能需要另一个问题来回答这个问题,还有另一个回答者:-)我不知道Hibernate。