2016-04-06 3 views
-3

Я сделал вход JSP, Я использую Hibernate OneToOne аннотацию, что для UserAdmin и wafat, класса UserAdmin для входа в системе, если есть для ПК (UserAdmin) запись в wafat это хорошо, но когда нет PK (UserAdmin) запись в wafat я получил эту ошибку ~ java.lang.IndexOutOfBoundsException: Index: 0, Size: 0java.lang.IndexOutOfBoundsException: Индекс: 0 Размер: 0 для OneToOne аннотации

это мой ERD ~

enter image description here

это запись из wafat таблицы,

enter image description here

это запись из таблицы пользователя,

enter image description here

это UserAdmin класс,

package org.ppbni.splatter.model; 

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.Column; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Entity; 
import javax.persistence.PrimaryKeyJoinColumn; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.persistence.OneToOne; 
import javax.persistence.CascadeType; 

@SuppressWarnings("serial") 
@Entity 
@Table(name="user") 
public class UserAdmin implements Serializable{ 

@Id 
@GeneratedValue 
@Column(name="no_dana", unique=true, nullable=false) 
private String no_dana; 

@Column(name="npp") 
private String npp; 

@Column(name="password") 
private String password; 

@OneToOne(mappedBy="useradmin", cascade=CascadeType.ALL) 
@PrimaryKeyJoinColumn 
private Wafat wafat; 

/**Setter and Getter Methods**/ 

} 

это мой класс wafat,

package org.ppbni.splatter.model; 

import java.io.Serializable; 
import java.util.Date; 
import javax.persistence.Column; 
import javax.persistence.Id; 
import javax.persistence.Entity; 
import javax.persistence.JoinColumn; 
import javax.persistence.MapsId; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 

@SuppressWarnings("serial") 
@Entity 
@Table(name="wafat") 
public class Wafat implements Serializable{ 

@Id 
@Column(name="kode_wafat", unique=true, nullable=false) 
private String kode_wafat; 

@Id 
@JoinColumn(name="no_dana") 
private String no_dana; 

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="tgl_wafat") 

@Column(name="usia_wafat") 
private Date tgl_wafat; 

@Column(name="usia_wafat") 
private int usia_wafat; 

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="tgl_makam") 
private Date tgl_makam; 

@Column(name="tempat_makam") 
private String tempat_makam; 

@OneToOne 
@MapsId 
@JoinColumn(name="no_dana") 
private UserAdmin useradmin; 

/**Setter and Getter Methods**/ 
} 

это пу контроллер Логин,

@RequestMapping(value="/afterlogin.html", method = RequestMethod.GET) 
public String directIndex(ModelMap model) { 
    User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    String sessionUser = user.getUsername(); 

    try { 
     UserAdmin dataUser = userService.get(sessionUser); 
     String userAuth = dataUser.getAuthority(); 
     System.out.println(userAuth); 
     if(userAuth.equals("ROLE_ANGGOTA") || userAuth.equals("ROLE_PENGURUS")){ 
      return "redirect:/user/index.html"; 
     } 
     else if(userAuth.equals("ROLE_ADMIN")){ 
      return "redirect:/admin/index.html"; 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return null; 
} 

это ошибка ~

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
at java.util.ArrayList.rangeCheck(Unknown Source) 
at java.util.ArrayList.get(Unknown Source) 
at org.ppbni.splatter.dao.impl.UserDaoImpl.get(UserDaoImpl.java:33) 
at org.ppbni.splatter.service.impl.UserServiceImpl.get(UserServiceImpl.java:21) 
at org.ppbni.splatter.web.controller.LoginController.directIndex(LoginController.java:39) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

это часть моей дао,

@SuppressWarnings("unchecked") 
@Override 
public UserAdmin get(String no_dana)throws Exception{ 

    DetachedCriteria criteria = DetachedCriteria.forClass(UserAdmin.class).add(Restrictions.eq("no_dana", no_dana)); 
    List<UserAdmin> userList = getHibernateTemplate().findByCriteria(criteria); 
    return userList.get(0); 

} 

любая помощь будет приятно :)

+2

Пожалуйста, разместите полный стек. – f1sh

+2

Трассировка стека исключения должна точно указать, где именно это исключение. Прочтите его и опубликуйте. –

+4

Что касается остальной части кода: пожалуйста, уменьшите его до соответствующих частей, то есть, если проблема связана с отношением один к одному, все эти другие геттеры и сеттеры действительно не нужны для публикации здесь - это загромождает вопрос и позволяет легко упустить что-то. – Thomas

ответ

2

Так как вы добавляете Restrictions.eq("no_dana", no_dana) ваших критериев шансов, что нет соответствующего пользователя, что ограничение. Следовательно, вызов userList.get(0) приведет к указанному исключению: это означает, что вы пытаетесь получить доступ к первому индексу (0) из нулевых индексов (размер 0), которые явно не могут работать.

Чтобы решить эту проблему, вам необходимо указать размер userList. через userList.isEmpty() или userList.size() > 0.

Что вы делаете, если нет пользователя зависит от остальной части приложения:

  • вы могли вернуться null в этом случае это будет означать, что пользователь не был найден, и вы должны действовать соответствующим образом
  • вы можете напрямую генерировать исключение, предпочтительно какое-то именованное исключение, например UserNotFoundException и т. Д., то вы можете либо обработать это в вызывающем, либо передать его полностью на контроллер, и отобразить соответствующее сообщение пользователю
  • создать нового пользователя (возможно, нет, вам наверняка захочется контролировать, какие пользователи создаются и когда)
  • сделать что-то другое (все, что уместно в вашем случае)

Update

Похоже, ваше отображение является неправильным. Из редактирования это выглядит так: UserAdmin и Wafat следует сопоставить с использованием no_dana. Следовательно, я бы предложил Wafat быть принадлежащей стороне отношения с no_dana, являющейся столбцом объединения. Это означало бы, что wafat в UserAdmin должен быть аннотирован с @OneToOne(mappedBy="useradmin", cascade=CascadeType.ALL). Если могут быть пользователи без wafat, вы можете добавить optional=true.

Таким образом, когда нет Wafat, который ссылается на UserAdmin экземпляра по wafat поле должно быть нулевым при загрузке этого UserAdmin.

Btw, @PrimaryKeyJoinColumn необходимо удалить.

+0

, но проблема в том, что пользователь Я смотрю, что существует и по-прежнему показывает эту ошибку ... У меня есть пользователь таблицы и wafat, которые связаны с аннотацией OneToOne, когда user.no_dana существует в wafat.no_dana, но это нормально, но когда user.no_dana не существует в wafat.no_dana он покажет, что ошибка ~ –

+0

@splatter_fadli ошибка все еще действительна: ваш запрос не возвращает никакого пользователя. Таким образом возникает вопрос: почему пользователь не найден? Проблема заключается в том, что ваше сопоставление неверно: как useradmin, так и wafat (что бы то ни было) утверждают, что они владеют стороной отношения, но работают с разными значениями. Добавьте 'mappedBy' в одну из аннотаций OneToOne и поместите свойство join/column в другой объект. – Thomas

+0

Я отредактировал мой вопрос, есть мой ERD, запись пользователя и wafat и сделать мой класс более простым для чтения :) –

0
List<UserAdmin> userList = getHibernateTemplate().findByCriteria(criteria); 
return userList.get(0); 

добавить проверка на вашем List:

List<UserAdmin> userList = getHibernateTemplate().findByCriteria(criteria); 

if(userList!=null && !userList.isEmpty()){ 
    return userList.get(0); 
} 
// throw a custom Exception, IllegalArgumentException as an example here 
throw new IllegalArgumentException("No user were found"); 
return null; 

на контроллер:

try { 
     UserAdmin dataUser = userService.get(sessionUser); 
     String userAuth = dataUser.getAuthority(); 
     System.out.println(userAuth); 
     if(userAuth.equals("ROLE_ANGGOTA") || userAuth.equals("ROLE_PENGURUS")){ 
      return "redirect:/user/index.html"; 
     } 
     else if(userAuth.equals("ROLE_ADMIN")){ 
      return "redirect:/admin/index.html"; 
     } 
    } catch(IllegalArgumentException ex){ 
     //handle it properly here 
    }catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

, но проблема в том, что пользователь, которого я ищу, существует и до сих пор показываю, что ошибка ~ –

+0

@splatter_fadli проверяет 'ùserName' ваши запросы и убедитесь, что они существуют на db –

+0

Я уже проверил это и существует ... у меня есть table и wafat, которые связаны с аннотацией OneToOne, когда user.no_dana существует в wafat.no_dana в порядке, но когда user.no_dana не существует в wafat.no_dana, он будет показывать эту ошибку ~ –

Смежные вопросы