2016-12-22 11 views
0

DropDownメニューの文字列値をBoreholeTypeオブジェクトのインスタンスに変換してボアホールオブジェクトに挿入しようとすると、(入力フォームに「送信」をクリックした後で)このエラーが発生します。Spring MVC - ネストされた例外はjava.lang.NullPointerExceptionです

プロパティid_borehole_typeが例外を送出しました。 http://howtodoinjava.com/spring/spring-mvc/spring-mvc-populate-and-validate-dropdown-example/

マイコード:

1)Borehole.java

@Entity 
@Table(name = "BOREHOLE") 
public class Borehole { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    @OneToOne 
    BoreholeType id_borehole_type; 

    //other fields, getters & setters 
} 
ネストされた例外は、私がこのチュートリアルに基づいて私のWebアプリのこの部分を作成すると、java.lang.NullPointerException

です

2)BoreholeType.java

@Entity 
@Table(name = "BOREHOLE_TYPE") 
public class BoreholeType { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    private String type; 

    //setters, getters 
} 

3)BoreholeTypeRepositoryImpl.java

@Repository 
@Transactional 
public class BoreholeTypeRepositoryImpl implements BoreholeTypeRepository { 

    @PersistenceContext 
    private EntityManager em; 

    //... 

    @Override 
    public BoreholeType getBoreholeTypeById(int id) { 
     TypedQuery<BoreholeType> boreholeTypeQuery = em.createQuery("SELECT b FROM BoreholeType b WHERE b.id = '" + id + "'", BoreholeType.class); 
     BoreholeType boreholeType = boreholeTypeQuery.getSingleResult(); 
     return boreholeType; 
    } 
} 

4)BoreholeTypeServiceImpl.java

@Service 
public class BoreholeTypeServiceImpl implements BoreholeTypeService { 
    @Autowired 
    private BoreholeTypeRepository boreholeTypeRepository; 

    @Override 
    public List<BoreholeType> getBoreholeTypes() { 
     return boreholeTypeRepository.getAllBoreholeTypes(); 
    } 

    @Override 
    public BoreholeType getBoreholeTypeById(int id) { 
     return boreholeTypeRepository.getBoreholeTypeById(id); 
    } 

    //... 
} 

5)BoreholeTypeEditor.java

public class BoreholeTypeEditor extends PropertyEditorSupport { 
    @Autowired 
    private BoreholeTypeService boreholeTypeService; 

    @Override 
    public void setAsText(String id) { 
     System.out.println("ID: " + id); 
     // <---------------- To this moment everything is fine 
     BoreholeType boreholeType = boreholeTypeService.getBoreholeTypeById(Integer.parseInt(id)); 

     System.out.println("ID: " + boreholeType.getId() + ", Value: " + boreholeType.getType()); 
     this.setValue(boreholeType); 
    } 
} 

6)BoreholeController.java

@Controller 
public class BoreholeController { 
    @Autowired 
    private BoreholeService boreholeService; 

    @Autowired 
    private BoreholeTypeService boreholeTypeService; 

    @InitBinder 
    public void initBinder(WebDataBinder binder) { 
     binder.registerCustomEditor(BoreholeType.class, new BoreholeTypeEditor()); 
    } 

    @GetMapping("/add_borehole") 
    public String showBoreholeForm(@ModelAttribute("newBorehole") Borehole newBorehole) { 
     return "add_borehole"; 
    } 

    @PostMapping("/add_borehole") 
    public String processAddNewBoreholeForm(@ModelAttribute("newBorehole") @Valid Borehole boreholeToAdd, 
      BindingResult bindingResult, HttpServletRequest request) { 
     if (bindingResult.hasErrors()) { 
      return "add_borehole"; 
     } 

     try { 
      boreholeService.addBorehole(boreholeToAdd); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return "add_borehole"; 
     } 

     return "borehole"; 
    } 
} 

7)add_borehole.jsp

<form:form modelAttribute="newBorehole" method="POST" 
     action="add_borehole"> 
     <table> 
      <tr> 
       <td><spring:message text="_____" /></td> 
       <td><form:select path="id_borehole_type"> 
        <form:options items="${allBoreholeTypes}" itemValue="id" itemLabel="type" /> 
        </form:select></td> 
       <td><form:errors path="id_borehole_type" cssClass="error" /></td> 
      </tr> 
      <tr> 
       <td colspan="3"><input type="submit" value="Dodaj odwiert"></td> 
      </tr> 
     </table> 
    </form:form> 

アプリの作業罰金このライン(BoreholeTypeEditor.java)前:

私は(私は初心者だから、それは春のフレームワークで、非常に可能ですミスを犯した
BoreholeType boreholeType = boreholeTypeService.getBoreholeTypeById(Integer.parseInt(id)); 

)? (コンバーター付)この種の問題を解決するための

答えて

0

ステップ:

1)は、新たなコンバータクラスを作成します。

public class StringToBoreholeTypeConverter implements Converter<String, BoreholeType> { 
    @Autowired 
    private BoreholeTypeService boreholeTypeService; 

    @Override 
    public BoreholeType convert(String source) { 
     if (source == null || source.isEmpty()) { 
      return null; 
     } 
     BoreholeType boreholeType = boreholeTypeService.getBoreholeTypeById(Integer.parseInt(source)); 
     return boreholeType; 
    } 

} 

2)コンテキストファイルへのコンバータBeanを追加します。

<mvc:annotation-driven conversion-service="conversionService" /> 

<bean id="conversionService" 
     class="org.springframework.context.support.ConversionServiceFactoryBean"> 
    <property name="converters"> 
     <set> 
      <bean class="com.example.converter.StringToBoreholeTypeConverter" /> 
     </set> 
    </property> 
</bean> 
関連する問題