Spring-无法将java.lang.String类型的属性值转换为所需类型
我正在为春季的住房协会做一个项目 当我试图将一个对象添加到我的公寓列表时,我得到一个错误,该错误以某种方式写在页面上: 公寓与一幢大楼有许多联系 公寓管理员:Spring-无法将java.lang.String类型的属性值转换为所需类型,spring,spring-mvc,Spring,Spring Mvc,我正在为春季的住房协会做一个项目 当我试图将一个对象添加到我的公寓列表时,我得到一个错误,该错误以某种方式写在页面上: 公寓与一幢大楼有许多联系 公寓管理员: package pl.dmcs.spoldzielnia.controllers; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Auto
package pl.dmcs.spoldzielnia.controllers;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
import pl.dmcs.spoldzielnia.domain.Apartment;
import pl.dmcs.spoldzielnia.service.ApartmentService;
import pl.dmcs.spoldzielnia.service.BuildingService;
@Controller
@SessionAttributes
public class ApartmentController {
@Autowired
ApartmentService apartmentService;
@Autowired
BuildingService buildingService;
@RequestMapping("admin/apartment")
public String listApartment(Map<String, Object> map, HttpServletRequest request) {
int apartmentId = ServletRequestUtils.getIntParameter(request, "apartmentId" , -1);
if (apartmentId > 0)
{
Apartment apartment = apartmentService.getApartment(apartmentId);
apartment.setBuilding(buildingService.getBuilding(apartmentService.getApartment(apartmentId).getBuilding().getId()));
map.put("selectedBuilding", apartmentService.getApartment(apartmentId).getBuilding().getId());
map.put("apartment", apartment);
}
else
map.put("apartment", new Apartment());
map.put("buildingList", buildingService.listBuilding());
map.put("apartmentList", apartmentService.listApartment());
return "apartment";
}
@RequestMapping(value = "admin/addApartment", method = RequestMethod.POST)
public String addContact(@ModelAttribute("apartment") Apartment apartment, BindingResult result,
HttpServletRequest request, Map<String, Object> map) {
if (result.getErrorCount()==0)
{
if (apartment.getId()==0)
{
if (apartment.getBuilding().getId() > 0)
apartment.setBuilding(buildingService.getBuilding(apartment.getBuilding().getId()));
apartmentService.addApartment(apartment);
}
else
{
apartmentService.editApartment(apartment);
}
return "redirect:/admin/apartment.html";
}
map.put("buildingList", buildingService.listBuilding());
map.put("apartmentList", apartmentService.listApartment());
return "apartment";
}
@RequestMapping("admin/delete/apartment/{apartmentId}")
public String deleteApartment(@PathVariable("apartmentId") Integer apartmentId) {
apartmentService.removeApartment(apartmentId);
return "redirect:/admin/apartment.html";
}
// @RequestMapping("/apartment")
// public ModelAndView showContacts() {
//
// return new ModelAndView("apartment", "command", new Apartment());
// }
楼宇服务实施:
package pl.dmcs.spoldzielnia.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pl.dmcs.spoldzielnia.dao.BuildingDAO;
import pl.dmcs.spoldzielnia.domain.Building;
import pl.dmcs.spoldzielnia.domain.Building;
@Service
@Transactional
public class BuildingServiceImpl implements BuildingService{
@Autowired
BuildingDAO buildingDAO;
@Transactional
public void addBuilding(Building building) {
buildingDAO.addBuilding(building);
}
@Transactional
public List<Building> listBuilding() {
return buildingDAO.listBuilding();
}
@Transactional
public Building getBuilding(int id) {
return buildingDAO.getBuilding(id);
}
@Transactional
public void removeBuilding(int id) {
buildingDAO.removeBuilding(id);
}
@Transactional
public void editBuilding(Building building) {
buildingDAO.editBuilding(building);
}
}
包pl.dmcs.spoldzielnia.service;
导入java.util.List;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
导入org.springframework.stereotype.Service;
导入org.springframework.transaction.annotation.Transactional;
导入pl.dmcs.spoldzielnia.dao.BuildingDAO;
导入pl.dmcs.spoldzielnia.domain.Building;
导入pl.dmcs.spoldzielnia.domain.Building;
@服务
@交易的
公共类BuildingServiceImpl实现BuildingService{
@自动连线
楼道楼道;
@交易的
公共建筑(建筑){
楼道。加楼(楼);
}
@交易的
公共建筑清单(){
返回buildingDAO.listBuilding();
}
@交易的
公共建筑(内部id){
返回buildingDAO.getBuilding(id);
}
@交易的
公共无效移除建筑(内部id){
buildingDAO.removeBuilding(id);
}
@交易的
公共建筑(建筑){
楼道。编辑楼(楼);
}
}
您能帮我解决我的问题吗?问题是您假设Spring MVC将能够根据传递的数据填充公寓对象。从表单上看,建筑编号是12,这可能是数据库中建筑的唯一标识符,但是Spring MVC如何知道如何进入数据库,检索适当的建筑对象并将其放入公寓对象 请记住,通过SpringMVC参数映射的对象是常规Java POJO,而不是Hibernate连接的实体。因此,当映射发生时,SpringMVC试图将building类型的building属性中的“12”放入POJO中(这解释了您得到的错误) 您有两个选择: 首先,您可以注册自定义格式化程序,该格式化程序将使用传递的id从数据库检索建筑:
import org.springframework.core.convert.converter.Converter;
public class BuildingIdToBuildingConverter implements Converter<String, Building> {
private BuildingService buildingService;
public BuildingIdToBuildingConverter(BuildingService buildingService) {
this.buildingService = buildingService;
}
@Override
public Building convert (String id) {
return buildingService.getBuilding(id);
}
}
其次,通过在单独的参数中发送建筑id手动执行此操作:
@RequestMapping(value = "admin/addApartment", method = RequestMethod.POST)
public String addContact(@ModelAttribute("apartment") Apartment apartment, @RequestParam("buildingId") String buildingId, BindingResult result, HttpServletRequest request, Map<String, Object> map) {
if (result.getErrorCount()==0){
if (apartment.getId()==0){
apartment.setBuilding(buildingService.getBuilding(buildingId));
apartmentService.addApartment(apartment);
}
}
else{
apartmentService.editApartment(apartment);
}
return "redirect:/admin/apartment.html";
}
map.put("buildingList", buildingService.listBuilding());
map.put("apartmentList", apartmentService.listApartment());
return "apartment";
}
@RequestMapping(value=“admin/addpartment”,method=RequestMethod.POST)
公共字符串addContact(@ModelAttribute(“公寓”)公寓、@RequestParam(“buildingId”)字符串buildingId、BindingResult、HttpServletRequest请求、映射){
if(result.getErrorCount()==0){
if(公寓.getId()==0){
公寓.setBuilding(buildingService.getBuilding(buildingId));
公寓服务。公寓(公寓);
}
}
否则{
公寓服务。编辑公寓(公寓);
}
返回“重定向:/admin/plantment.html”;
}
put(“buildingList”,buildingService.listBuilding());
put(“apartmentList”,apartmentService.List公寓());
返回“公寓”;
}
并相应地更改HTML以发送buildingId值。问题在于您假设Spring MVC将能够根据传递的数据填充公寓对象。从表单上看,建筑编号是12,这可能是数据库中建筑的唯一标识符,但是Spring MVC如何知道如何进入数据库,检索适当的建筑对象并将其放入公寓对象 请记住,通过SpringMVC参数映射的对象是常规Java POJO,而不是Hibernate连接的实体。因此,当映射发生时,SpringMVC试图将building类型的building属性中的“12”放入POJO中(这解释了您得到的错误) 您有两个选择: 首先,您可以注册自定义格式化程序,该格式化程序将使用传递的id从数据库检索建筑:
import org.springframework.core.convert.converter.Converter;
public class BuildingIdToBuildingConverter implements Converter<String, Building> {
private BuildingService buildingService;
public BuildingIdToBuildingConverter(BuildingService buildingService) {
this.buildingService = buildingService;
}
@Override
public Building convert (String id) {
return buildingService.getBuilding(id);
}
}
其次,通过在单独的参数中发送建筑id手动执行此操作:
@RequestMapping(value = "admin/addApartment", method = RequestMethod.POST)
public String addContact(@ModelAttribute("apartment") Apartment apartment, @RequestParam("buildingId") String buildingId, BindingResult result, HttpServletRequest request, Map<String, Object> map) {
if (result.getErrorCount()==0){
if (apartment.getId()==0){
apartment.setBuilding(buildingService.getBuilding(buildingId));
apartmentService.addApartment(apartment);
}
}
else{
apartmentService.editApartment(apartment);
}
return "redirect:/admin/apartment.html";
}
map.put("buildingList", buildingService.listBuilding());
map.put("apartmentList", apartmentService.listApartment());
return "apartment";
}
@RequestMapping(value=“admin/addpartment”,method=RequestMethod.POST)
公共字符串addContact(@ModelAttribute(“公寓”)公寓、@RequestParam(“buildingId”)字符串buildingId、BindingResult、HttpServletRequest请求、映射){
if(result.getErrorCount()==0){
if(公寓.getId()==0){
公寓.setBuilding(buildingService.getBuilding(buildingId));
公寓服务。公寓(公寓);
}
}
否则{
公寓服务。编辑公寓(公寓);
}
返回“重定向:/admin/plantment.html”;
}
put(“buildingList”,buildingService.listBuilding());
put(“apartmentList”,apartmentService.List公寓());
返回“公寓”;
}
并相应地更改HTML以发送buildingId值。附加异常日志。附加异常日志。