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.