org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.StringIndexOutOfBoundsException:

0

My servlet:

<context:component-scan base-package="com.tricas.controllers" />
<mvc:annotation-driven />

<context:annotation-config />
<context:component-scan base-package="com" />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/pages/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>       
</bean>    

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/cobranzas" />
    <property name="username" value="root" />
    <property name="password" value="12345" />
</bean>

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="annotatedClasses">
        <list>                
            <value>com.tricas.models.Perfil</value>
        </list>            
    </property>
    <property name="packagesToScan" value="com.tricas.models" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.enable_lazy_load_no_trans">true</prop>                
            <prop key="format_sql">true</prop>
            <prop key="use_sql_comments">true</prop>                
        </props>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
      class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

My web.xml

<servlet>
    <servlet-name>spring-web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/springMVC.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring-web</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>
        verusuarios.html
    </welcome-file>
</welcome-file-list>

<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>

My Annex model

public class Anexo implements Serializable {

@OneToMany(mappedBy = "encargado")
private Collection<Caja> cajaCollection;

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idanexo")
private Integer idanexo;
@Column(name = "nombre")
private String nombre;
@Column(name = "apepat")
private String apepat;
@Column(name = "apemat")
private String apemat;
@Column(name = "tipodocumento")
private String tipodocumento;
@Column(name = "numdocumento")
private String numdocumento;
@Column(name = "direccion")
private String direccion;
@Column(name = "aahh")
private String aahh;
@Column(name = "cpm")
private String cpm;
@Column(name = "sector")
private String sector;
@Column(name = "referencia")
private String referencia;
@Column(name = "telefono")
private String telefono;
@Column(name = "celular")
private String celular;
@Column(name = "edad")
private Integer edad;
@Column(name = "fechanac")
@Temporal(TemporalType.TIMESTAMP)
private Date fechanac;
@Column(name = "fechareg")
@Temporal(TemporalType.TIMESTAMP)
private Date fechareg;
@Column(name = "sexo")
private Character sexo;
@Column(name = "email")
private String email;
@Column(name = "tipoanexo")
private String tipoanexo;
@Column(name = "codven")
private String codven;
@Column(name = "estcivil")
private String estcivil;
@Column(name = "conyuge")
private String conyuge;
@Column(name = "dniconyu")
private String dniconyu;
@Column(name = "direccionconyu")
private String direccionconyu;
@Column(name = "ocupacionconyu")
private String ocupacionconyu;
@Column(name = "cpropia")
private String cpropia;
@Column(name = "zona")
private String zona;
@Column(name = "sueldo")
private Integer sueldo;
@Column(name = "tienda")
private String tienda;
@JoinColumn(name = "iddistrito", referencedColumnName = "iddistrito")
@ManyToOne
private Distrito iddistrito;
@OneToMany(mappedBy = "idanexo")
private Collection<Ocupacion> ocupacionCollection;
@OneToMany(mappedBy = "idanexo")
private Collection<Operacion> operacionCollection;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idanexo")
private Collection<Credito> creditoCollection;
@OneToMany(mappedBy = "idanexo")
private Collection<Creditoaval> creditoavalCollection;
@OneToMany(mappedBy = "idanexo")
private Collection<Conceptos> conceptosCollection;
@OneToMany(mappedBy = "idanexo")
private Collection<Usuario> usuarioCollection;

public Anexo() {
}

My AnexoDaoImpl

@Repository
@Transactional
public class AnexoDaoImpl implements AnexoDao{

@Autowired
private SessionFactory session;

@Override
public List<Anexo> anexos() {
    return session.getCurrentSession().createQuery("from Anexo ").list();               
}

@Override
public void ingresarModificar(Anexo anexo) {
    session.getCurrentSession().saveOrUpdate(anexo);
}

My AnexoService

@Service("anexoService")
public class AnexoService {

@Autowired
private AnexoDao anexodao;

@Transactional
public List<Anexo> getAllAnexo() {
    return anexodao.anexos();
}

@Transactional
public void crearModificar(Anexo u) {
    anexodao.ingresarModificar(u);
}

My AnexoController

@Controller("anexoController")
public class AnexoController {

@Autowired
private AnexoService anexoserv;

@RequestMapping(value = "/veranexos", method = RequestMethod.GET)
public String listPersons(Model model) {
    List<Anexo> list = anexoserv.getAllAnexo();
    model.addAttribute("anexo", new Anexo());
    model.addAttribute("list", list);
    return "anexo";
}

@RequestMapping(value = "/anexo/add", method = RequestMethod.POST)
public String addPerson(@ModelAttribute("anexo") Anexo p) {
    anexoserv.crearModificar(p);
    return "redirect:/veranexos";
}

@RequestMapping("/edita/{idanexo}")
public String editPerson(@PathVariable("idanexo") int id, Model model) {
    model.addAttribute("anexo", anexoserv.getById(id));
    model.addAttribute("list", anexoserv.getAllAnexo());
    return "anexo";
}

@RequestMapping("/removea/{idanexo}")
public String removePerson(@PathVariable("idanexo") int id) {
    Anexo p = new Anexo();
    p = anexoserv.getById(id);
    anexoserv.eliminar(p);
    return "redirect:/veranexos";
}

And finally my annex.jsp

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Mantenimiento Anexos</title>
    <style type="text/css">
        .tg  {border-collapse:collapse;border-spacing:0;border-color:#ccc;}
        .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#fff;}
        .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#f0f0f0;}
        .tg .tg-4eph{background-color:#f9f9f9}
    </style>
</head>
<body>
    <h1>Agregar un Perfil</h1>

    <c:url var="addAction" value="/anexo/add" ></c:url>

    <form:form action="${addAction}" commandName="anexo" id="registro">
        <table>
            <c:if test="${!empty anexo.apepat}">
                <tr>
                    <td>
                        <form:label path="idanexo">
                            <spring:message text="ID"/>
                        </form:label>
                    </td>
                    <td>
                        <form:input path="idanexo" readonly="true" size="8"  disabled="true" />
                        <form:hidden path="idanexo" />
                    </td> 
                </tr>
            </c:if>
            <tr>               
                <td>
                    <form:label path="nombre">
                        <spring:message text="Nombre"/>
                    </form:label>
                </td>
                <td>
                    <form:input path="nombre" />
                </td> 
            </tr>
            <tr>               
                <td>
                    <form:label path="apepat">
                        <spring:message text="Descripcion"/>
                    </form:label>
                </td>
                <td>
                    <form:input path="apepat" />
                </td> 
            </tr>                
            <tr>
                <td colspan="2">
                    <c:if test="${!empty anexo.apepat}">
                        <input type="submit"
                               value="<spring:message text="Editar Perfil"/>" />
                    </c:if>
                    <c:if test="${empty anexo.apepat}">
                        <input type="submit"
                               value="<spring:message text="Agregar Perfil"/>" />
                    </c:if>
                </td>
            </tr>

        </table>    
    </form:form>

    <h3>Lista de Perfiles</h3>
    <c:if test="${!empty list}">
        <table class="tg"> 
            <tr> 
                <th width="80">Id</th>
                <th width="90">Abrev.</th>
                <th width="120">Nombre</th>                     
                <th width="120">Editar</th>
                <th width="120">Eliminar</th>
                    <c:forEach items="${list}" var="anexo"> 
                <tr> 
                    <td>${anexo.idanexo}</td> 
                    <td>${anexo.nombre}</td>
                    <td>${anexo.apepat}</td>                         
                    <td><a href="<c:url value='/edita/${anexo.idanexo}' />" >Editar</a></td>
                    <td><a href="<c:url value='/removea/${anexo.idanexo}' />" >Eliminar</a></td>
                </tr> 
            </c:forEach> 
        </table>
    </c:if>
</body>

After running the project and trying to run the annexes view, I get the following error:

java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:646)
at org.hibernate.type.descriptor.java.CharacterTypeDescriptor.wrap(CharacterTypeDescriptor.java:78)
at org.hibernate.type.descriptor.java.CharacterTypeDescriptor.wrap(CharacterTypeDescriptor.java:33)
at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:74)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:263)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:259)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:334)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2969)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1695)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1627)
at org.hibernate.loader.Loader.getRow(Loader.java:1514)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:725)
at org.hibernate.loader.Loader.processResultSet(Loader.java:952)
at org.hibernate.loader.Loader.doQuery(Loader.java:920)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
at org.hibernate.loader.Loader.doList(Loader.java:2551)
at org.hibernate.loader.Loader.doList(Loader.java:2537)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2367)
at org.hibernate.loader.Loader.list(Loader.java:2362)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:229)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1260)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at com.tricas.dao.AnexoDaoImpl.anexos(AnexoDaoImpl.java:20)
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:497)

It clearly tells me that the exception jumps in the DAO, but I do not know why.

    
asked by John Lopez 15.02.2017 в 16:26
source

1 answer

0

Based on this question from the site in English indicates that it is very likely that the query is trying to load a string empty of the database (not null but "" ) in a field (Java) of type char or Character . To confirm this, it would be good to review all the entities associated with Anexo and verify that there is one that has an attribute of type char or Character .

    
answered by 16.02.2017 / 14:36
source