9

I have to take input for paper_name and date_of_birth as int and date datatype respectively from a form.

Below is the code:

<li> Number:<input type="text" name="paper_number" ></li>
< li>date of birth: <input type="text" name="date_of_birth"></ li>

I have paperNumber and dateOfBirth variable in the controller as int and Date datatypes respectively.

Please help me change the datatype of paper_number and date_of_birth from string to int and date respectively.

I have seen other answers on stackoverflow and they have used jstl for the same but I am not able to figure out how to apply it here.

Controller code:

@RequestMapping(value = "/student" , params = "add", method = RequestMethod.POST )
       public String postAddStudent(
                   @RequestParam("date_of_birth" ) Date date,
                   @RequestParam("paper_number" ) int paperNumber)

Below is the EntityClass

public class EntityClass extends BaseEntity {

@Column(name = "DATE_OF_BIRTH", nullable = false)
    @NotBlank
    @DateTimeFormat(pattern = "dd-mm-yyyy")
    private Date dateOfBirth;//TODO

    @Column(name = "PAPER_NUMBER")
    private short paperNumber;
..

}

Below is the log

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.Integer.
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
root cause

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.Integer.
    org.hibernate.validator.internal.engine.ConstraintTree.verifyResolveWasUnique(ConstraintTree.java:394)
    org.hibernate.validator.internal.engine.ConstraintTree.findMatchingValidatorClass(ConstraintTree.java:375)
    org.hibernate.validator.internal.engine.ConstraintTree.getInitializedValidator(ConstraintTree.java:333)
    org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:155)
    org.hibernate.validator.internal.engine.ConstraintTree.validateConstraints(ConstraintTree.java:125)
    org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:86)
    org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:442)
    org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup(ValidatorImpl.java:387)
    org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:351)
    org.hibernate.validator.internal.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:303)
    org.hibernate.validator.internal.engine.ValidatorImpl.validate(ValidatorImpl.java:133)
    org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:136)
    org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94)
    org.hibernate.action.internal.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:178)
    org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:75)
    org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
    org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:203)
    org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:183)
    org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:167)
    org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:320)
    org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
    org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
    org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:126)
    org.hibernate.ejb.event.EJB3MergeEventListener.saveWithGeneratedId(EJB3MergeEventListener.java:71)
    org.hibernate.event.internal.DefaultMergeEventListener.saveTransientEntity(DefaultMergeEventListener.java:236)
    org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:216)
    org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154)
    org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:910)
    org.hibernate.internal.SessionImpl.merge(SessionImpl.java:892)
    org.hibernate.engine.spi.CascadingAction$6.cascade(CascadingAction.java:288)
    org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
    org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
    org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
    org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
    org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:423)
    org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:213)
    org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:154)
    org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:76)
    org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:900)
    org.hibernate.internal.SessionImpl.merge(SessionImpl.java:884)
    org.hibernate.internal.SessionImpl.merge(SessionImpl.java:888)
    org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:879)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365)
    com.sun.proxy.$Proxy41.merge(Unknown Source)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
    com.sun.proxy.$Proxy41.merge(Unknown Source)
    org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:329)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:368)
    org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:349)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    com.sun.proxy.$Proxy53.save(Unknown Source)
    in.ac.jmi.controllers.AdminController.postAddStudent(AdminController.java:262)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
Md Faisal
  • 2,931
  • 8
  • 29
  • 34

4 Answers4

11

Hope you're using validation in hibernate like this,

@NotBlank
private Date some;

@NotBlank is for String type. There is no concept of java.util.Date being blank. It can be null or not null.. Use @NotNull instead,

@NotNull
@DateTimeFormat(pattern = "dd-mm-yyyy")
private Date dateOfBirth;

See Balus answer and @NotBlank for more details.

Update

HTTP Status 400: The request sent by the client was syntactically incorrect.

For the above error in Date type try add @DateTimeFormat annotation and mention the format of date you giving as input (say yyyy-mm-dd). Like below,

@RequestMapping(value="/fetch" , method=RequestMethod.GET)
public @ResponseBody String fetchResult(@RequestParam("from")   @DateTimeFormat(pattern="yyyy-MM-dd") Date fromDate) {
    //Content goes here
}
Community
  • 1
  • 1
Vinoth Krishnan
  • 2,925
  • 6
  • 29
  • 34
  • i have removed all the hibernate validations. and now it says " description: The request sent by the client was syntactically incorrect ()." – Md Faisal Mar 04 '16 at 10:28
  • Instead of `Date` and `int` type try with `String` type. The issue is controller not getting the value's as expected type. – Vinoth Krishnan Mar 04 '16 at 10:34
  • yeah with string it's working..!, but I have to use int and date in the form itself. – Md Faisal Mar 04 '16 at 11:34
  • Use `@ModelAttribute` parameter, If you're binding a request parameter to a field. See [Reference](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-typeconversion) – Vinoth Krishnan Mar 04 '16 at 11:45
  • can you please provide an example for the above. (for int the problem is solved) now remains date datatype only. – Md Faisal Mar 04 '16 at 12:00
  • See my answer update, since the date field is the only issue try with `@DateTimeFormat` annotation. It will work. – Vinoth Krishnan Mar 04 '16 at 12:10
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/105366/discussion-between-md-faisal-and-vinoth-krishnan). – Md Faisal Mar 04 '16 at 12:14
  • It worked, i was entering the date field like "1991-02-08" instead of "1991/02/08" in my jsp form, when I changed the input to later, the Controller accepted it. Thank you for your time @Vinoth – Md Faisal Mar 05 '16 at 05:37
0

well if you are not using any framework like spring mvc or controller , then you have to do it your self. Request parameter is always sent as string to server side. Now whether some frame work can do it before request arrives into your controller as part of your interceptor. Otherwise you have to do it manually after getting request.getParameter("param_name")

M Sach
  • 33,416
  • 76
  • 221
  • 314
0

If you want to restrict the input that is entered by the user, you will have to use Javascript to restrict the input type (You can use jQuery validator plugin for this).

Or else, if you want to convert the input entered by the user to integer and date, in your form action (servlet, perhaps), you will need to parse the integer using

Integer.parseInt(request.getParameter("integer_field_name"));

as for Date, use SimpleDateFormat API.

References:

  1. How to convert String to Date
  2. jQuery validator plugin
Kenpachi
  • 651
  • 1
  • 10
  • 21
0

I am not sure, but what I suspect is private short paperNumber; is the problem.. The request mapping is mapping the same to Integer, Not sure how downgrading Integer to small int works in hibernate.

Anand Vaidya
  • 1,374
  • 11
  • 26