2017-01-29 13 views
0

私はSpringでHousing Associationのプロジェクトを行っています。Spring - java.lang.String型のプロパティ値を必要な型に変換できませんでした

私はページ上で何らかの形で書かれているエラーを取得していますアパートの私のリストにオブジェクトを追加しようとしています: https://s28.postimg.org/vrhy6mbd9/blad.jpg

アパートは一つの建物に多くの関係を持っています。

アパートコントローラー:

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.domain; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.ManyToOne; 
import javax.persistence.Table; 


@Entity 
@Table(name="apartment") 
public class Apartment { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    int id; 
    @Column(name="apartmentNumber", nullable=false) 
    private String number; 

    public String getNumber() { 
     return number; 
    } 
    public void setNumber(String number) { 
     this.number = number; 
    } 
    public int getId() { 
     return id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 




    @ManyToOne 
    private Building building; 

    public Building getBuilding() { 
     return building; 
    } 
    public void setBuilding(Building building) { 
     this.building = building; 
    } 
} 


} 

ビルサービス実装:

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); 
    } 
} 

あなたは私の問題を解決するために助けてもらえますか?

+0

例外ログを添付します。 –

答えて

0

問題は、Spring MVCが渡されたデータからApartmentオブジェクトを埋めることができると仮定していることです。このフォームからビルディング番号は12であると思われます。これはおそらくデータベース内のBuildingの一意の識別子ですが、Spring MVCはデータベースへのアクセス方法、適切なビルディングオブジェクトの取得方法、アパートメントオブジェクト?

SpringMVCパラメータによってマップされるオブジェクトは、通常のJava POJOであり、Hibernate添付エンティティではありません。そのため、マッピングが実行されると、SpringMVCはPOJOへのBuilding型のビルディング属性に "12"を入れようとしています(あなたが得ているエラーを説明しています)。

は、2つのオプションがあります。

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); 
    } 
} 

そして、それを登録します:

public class AppConfig extends WebMvcConfigurerAdapter { 

    ... 

    @Bean 
    public BuildingService buildingService(){ 
     return new BuildingService(); 
    } 

    @Override 
    public void addFormatters (FormatterRegistry registry) { 
     registry.addConverter(new BuildingIdToBuildingConverter(buildingService())); 
    } 
} 
まず、あなたはそれがデータベースからビルを取得するために渡されたIDを使用しますが、カスタムフォーマッタを登録することができます

第2に、個別のパラメータで建物の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"; 
} 

それに応じてHTMLを変更し、buildingIdの値を送信します。

関連する問題