這是我第一次在這裏發佈。我有一個關於如何將來自「html select multiple」的數據保存到數據庫中的問題。我正在使用dto(數據傳輸對象)將我的表單中的輸入值傳遞給控制器。如何保存數據庫中的多個選擇
這是我的HTML代碼:
<form:form id="user-form" action="/admin/users/add-user/add-success" commandName="addUser" method="POST">
<fieldset>
<legend class="text-center">
<label class="text font-md">Profile Information</label>
</legend>
<div class="form-group">
<label class="control-label">Select Property <span class="important">*</span></label>
<select class="form-control custom-scroll" path="propertyList.propertyId" name="propertyId" id="propertyId" multiple>
<c:forEach var="property" items="${property}">
<option value="${property.id}" data-value="${property.prtCompany.id}"><c:out value="${property.propertyName}"/></option>
</c:forEach>
</select>
<div class="note">
<strong>Note:</strong> hold down the ctrl/cmd button to select multiple options.
</div>
</div>
<div class="form-actions">
<div class="row">
<div class="col-sm-12">
<button class="btn btn-primary" type="submit">
Submit
</button>
</div>
</div>
</div>
</fieldset>
</form:form>
這是我的控制器代碼:
@RequestMapping(value = "/admin/users/add-user/add-success", method = RequestMethod.POST)
public ModelAndView saveAddUser(ModelMap mvc, @ModelAttribute("addUser") UserProfileDto userProfileDto, HttpServletResponse response) throws IOException, ServerException {
ModelAndView mv = new ModelAndView("user-pages/user");
userProfileDto.setAuditId(auditService.logAuditCreate().getId());
userProfileDto = userProfileService.createUserProfile(userProfileDto);
return mv;
}
這是我ServiceImpl:
public UserProfileDto createUserProfile(UserProfileDto userProfileDto) {
UserProfile userProfile = new UserProfile();
userProfile = convertDtoToEntity(userProfile, userProfileDto);
save(userProfile);
return convertEntityToDto(userProfile);
}
protected UserProfile convertDtoToEntity(UserProfile userProfile, UserProfileDto dto) {
List<Property> propertyList = listUsersProperty(dto.getPropertyList());
userProfile.setProperty(propertyList);
return userProfile;
}
protected List<Property> listUsersProperty(List<PropertyDto> propertyDtoList) {
List<Property> propertyList = null;
for (PropertyDto propertyDto : propertyDtoList) {
propertyList.add(entityManager.find(Property.class, propertyDto.getId()));
}
return propertyList;
}
這是錯誤:
19:37:37,543 ERROR [io.undertow.request] (default task-40) UT005023: Exception handling request to /admin/users/add-user/add-success: org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.ejb.EJBException: java.lang.NullPointerException
Caused by: java.lang.NullPointerException
at com.altypaynet.crm.service.user.UserProfileServiceImpl.listUsersProperty(UserProfileServiceImpl.java:249)
at com.altypaynet.crm.service.user.UserProfileServiceImpl.convertDtoToEntity(UserProfileServiceImpl.java:261)
at com.altypaynet.crm.service.user.UserProfileServiceImpl.createUserProfile(UserProfileServiceImpl.java:136)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437)
at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:82)
at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93)
at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437)
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64)
at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51)
at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340)
at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275)
... 91 more
而且DTO的,
UserProfileDto:
public class UserProfileDto extends UserBaseDto {
public UserProfileDto() {
}
private List<PropertyDto> propertyList;
public List<PropertyDto> getPropertyList() {
return propertyList;
}
public void setPropertyList(List<PropertyDto> propertyList) {
this.propertyList = propertyList;
}
}
PropertyDto:
public class PropertyDto extends CompanyDto {
public PropertyDto() {
}
private String propertyId;
private String propertyNo;
private String propertyName;
private String propertyType;
private Integer propertyUnits;
private Integer propertyFloors;
public String getPropertyId() {
return propertyId;
}
public void setPropertyId(String propertyId) {
this.propertyId = propertyId;
}
public String getPropertyNo() {
return propertyNo;
}
public void setPropertyNo(String propertyNo) {
this.propertyNo = propertyNo;
}
public String getPropertyName() {
return propertyName;
}
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
public String getPropertyType() {
return propertyType;
}
public void setPropertyType(String propertyType) {
this.propertyType = propertyType;
}
public Integer getPropertyUnits() {
return propertyUnits;
}
public void setPropertyUnits(Integer propertyUnits) {
this.propertyUnits = propertyUnits;
}
public Integer getPropertyFloors() {
return propertyFloors;
}
public void setPropertyFloors(Integer propertyFloors) {
this.propertyFloors = propertyFloors;
}
}
我已經嘗試搜索這個,但遺憾的是沒有一個解決我的問題。我希望你能幫助我。謝謝。
注意:也許你們中的一些人可能會問這個屬性與userprofile有什麼關係,我刪除了代碼中包含的一些代碼,我只是發佈了與錯誤相關的代碼。
大注意:厭倦我的壞話。我盡力了。
你永遠不會初始化你的「propertyList」爲null以外的任何東西(列表 propertyList = null;)。所以顯然你會得到一個NPE,當試圖調用propertyList.add(...) –
可能重複[什麼是NullPointerException,以及如何解決它?](http://stackoverflow.com/questions/218384/ what-is-a-nullpointerexception-and-how-do-i-fix-it) –
@ 911DidBush List propertyList = null; (PropertyDto propertyDto:propertyDtoList){ propertyList.add(entityManager.find(Property.class,propertyDto.getId())); } return propertyList; 對於每一個它不應該返回null。 –
Sytor