web-dev-qa-db-fra.com

Le paramètre long facultatif est présent mais ne peut pas être traduit en une valeur nulle

Salut, je développe sur le Web, donc j'ai une fonction ajax qui appelle à une fonction de contrôleur qui appelle à une fonction DAO (pour apporter des modifications sur DB). Je reçois l'exception ci-dessus dans la fonction de contrôleur ..

fonction du contrôleur:

@RequestMapping(value="/changeIsPublic", method=RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public  @ResponseBody boolean changeIsPublic(HttpServletRequest request, Locale locale, Model model, long transactionId, boolean isPublic) {
    boolean result = false; 
    try {
            boxDao.changeIsPublicStatus(transactionId, isPublic);
            result = true;

        } catch (Exception e) {
            logger.debug("Failed to publish transaction. transaction ID: " + transactionId + e.getMessage());
        }
        return result;
}

Fonction DAO:

public Box changeIsPublicStatus(long id, boolean isPublic) {
    Criteria criteria = getCurrentSession().createCriteria(Box.class);
    criteria.add(Restrictions.eq("id", id));
    Box transaction = (Box) criteria.uniqueResult();
    transaction.setIsPublic(isPublic);
    return transaction;
}

exception:

    SEVERE: Servlet.service() for servlet [appServlet] in context with path [/goblin] threw exception [Request processing failed; nested exception is Java.lang.IllegalStateException: Optional long parameter 'transactionId' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.] with root cause
Java.lang.IllegalStateException: Optional long parameter 'transactionId' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
    at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.handleNullValue(AbstractNamedValueMethodArgumentResolver.Java:188)
    at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.Java:94)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.Java:77)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.Java:162)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.Java:123)
    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 org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.Java:149)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.Java:107)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:243)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
    at com.yes.Java.security.AuthenticationFilter.doFilter(AuthenticationFilter.Java:105)
    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:502)
    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:953)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1023)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:310)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at Java.lang.Thread.run(Unknown Source)    `
10
Erez

L’erreur est assez explicite: vous ne pouvez pas déclarer une primitive comme étant null
par exemple: private int myNumber = null; ne compilera pas. Ainsi, au lieu d'utiliser long, utilisez Long et vous devriez être prêt à partir.

7
alfasin

J'ai eu cette erreur lorsque je travaillais avec les services Web Jackson REST (contrôleurs de printemps RESTful). Le problème était que j'avais oublié l'annotation @PathVariable qui indique au service Web où il devrait recevoir votre entrée pour produire la réponse afin qu'il ne sache pas où je devrais transmettre mon entrée. Ma solution était:

@RequestMapping(value = "/supplier/{supplierId}")
public List<PurchaseInvoice> getPurchaseInvoicesBySupplierId(@PathVariable int supplierId) {
    return purchaseInvoiceService.getPurchaseInvoicesBySupplierId(supplierId);
}
12
Ahmed Tawila

Le message d'exception vous guide. Changer long type en long

11
gefrag

@ Ahmed Tawila - comme il l'a mentionné, j'ai fait la même erreur. J'ai oublié d'ajouter @Pathvariable annotation avant le type primitif de la méthode dans le contrôleur.

Code incorrect: l'annotation requise n'est pas définie avant le type primitif long

@RequestMapping(method = RequestMethod.DELETE, value = "/categories/{categoryId}/subcategories/{id}")
public void deleteSubCategory(long id) throws Exception {
    subCategoryService.delete(id);
}

Code correct: annotation ajoutée (@PathVariable)

@RequestMapping(method = RequestMethod.DELETE, value = "/categories/{categoryId}/subcategories/{id}")
public void deleteSubCategory(@PathVariable long id) throws Exception {
    subCategoryService.delete(id);
}
0
Prabhakar

Un concept de base pour débutant à partir de Quelle est la différence entre long et long en code Android?

Long est une classe. long est un primitif. Cela signifie que long peut être nul, où long ne peut pas. Long peut aller n'importe où qui prend un objet, longtemps ne peut pas (puisqu'il ne s'agit pas d'une classe, il ne dérive pas d'objet).

Java traduit généralement un long en long automatiquement (et vice versa), mais pas les valeurs nulles (car long ne peut pas être nul), et vous devez utiliser la version Long lorsque vous devez passer une classe ( comme dans une déclaration générique).

0
Frank.Chang