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
ネストされた例外は、私がこのチュートリアルに基づいて私のWebアプリのこの部分を作成すると、java.lang.NullPointerException@Entity @Table(name = "BOREHOLE") public class Borehole { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @OneToOne BoreholeType id_borehole_type; //other fields, getters & setters }
です
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));
)? (コンバーター付)この種の問題を解決するための