Java 与spring framework错误的预期类型不匹配

Java 与spring framework错误的预期类型不匹配,java,spring,Java,Spring,我有一个基于spring框架的服务 我想知道为什么我有这个例外,虽然我发送一个整数到我的服务 错误[io.undertow.request](默认任务-13)UT005023:异常 处理发送至/updateUserAnswer/11的请求: org.lightadmin.core.view.exceptions.BadRequestException: org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 java.l

我有一个基于spring框架的服务 我想知道为什么我有这个例外,虽然我发送一个整数到我的服务

错误[io.undertow.request](默认任务-13)UT005023:异常 处理发送至/updateUserAnswer/11的请求: org.lightadmin.core.view.exceptions.BadRequestException: org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 java.lang.IllegalArgumentException:参数值[11]不匹配 预期类型[java.lang.Integer(不适用)]

这是我的控制器

@RequestMapping(value = "/updateUserAnswers/{userId}", method = RequestMethod.PUT)
    public Response updateUserAnswer(@PathVariable("userId") Long userId,
            @RequestBody @Valid UserAnswer userAnswer) {

        userAnswerService.updateUserAnswer(userId, userAnswer);

        HashMap<String, Object> response = new HashMap<>();
        response.put("messages", null);
        response.put("success", Boolean.valueOf(true));
        return Response.instance().friendlyName("user-answer-updated").object(response).statusCode(HttpStatus.OK);
    }
@RequestMapping(value=“/updateUserAnswers/{userId}”,method=RequestMethod.PUT)
公共响应updateUserAnswer(@PathVariable(“userId”)长userId,
@RequestBody@Valid UserAnswer UserAnswer){
updateUserAnswerService.updateUserAnswer(用户标识,用户应答);
HashMap响应=新建HashMap();
response.put(“messages”,null);
response.put(“success”,Boolean.valueOf(true));
返回Response.instance();
}
这是我的服务:

public void updateUserAnswer(Long userId,UserAnswer userAnswer) {

    List<UserAnswer> currentUserAnswer = userAnswerRepo.getUserAnswers(userId, userAnswer.getAnswerId().longValue(),null);
    currentUserAnswer.get(0).setLabel(userAnswer.getLabel());       

    List<UserAnswerField> fieldsList =  new ArrayList<UserAnswerField>();


    for (UserAnswerField userAnswerField : userAnswer.getAnswerFields()) {
        UserAnswerField currentUserAnswerField = userAnswerFieldRepo.getUserAnswerField(userAnswerField.getfieldId());
        if (currentUserAnswerField != null) {
            currentUserAnswerField.setfield(userAnswerField.getfield());
            currentUserAnswerField.setTypeId(userAnswerField.getTypeId());
            fieldsList.add(currentUserAnswerField);
            //userAnswerFieldRepo.save(currentUserAnswerField);
        }           
    }   
    currentUserAnswer.get(0).setAnswerFields(fieldsList);

    userAnswerRepo.save(currentUserAnswer.get(0));
}   
public void updateUserAnswer(长用户ID,UserAnswer-UserAnswer){
List currentUserAnswer=userAnswerRepo.getUserAnswers(userId,userAnswer.getAnswerId().longValue(),null);
currentUserAnswer.get(0.setLabel)(userAnswer.getLabel());
列表字段列表=新的ArrayList();
for(UserAnswerField UserAnswerField:userAnswer.getAnswerFields()){
UserAnswerField currentUserAnswerField=userAnswerFieldRepo.getUserAnswerField(UserAnswerField.getfieldId());
如果(currentUserAnswerField!=null){
currentUserAnswerField.setfield(userAnswerField.getfield());
currentUserAnswerField.setTypeId(userAnswerField.getTypeId());
fieldsList.add(currentUserAnswerField);
//userAnswerFieldRepo.save(当前useranswerfield);
}           
}   
currentUserAnswer.get(0).setAnswerFields(fieldsList);
userAnswerRepo.save(currentUserAnswer.get(0));
}   
存储库:

public List<UserAnswer> getUserAnswers(Long userId,Long answerId ,String pageType) {
    try {
        String qlString = ""
                + " Select sf from UserAnswer sf "
                + " where "
                + " sf.userId = :userId ";
        if(pageType != null){
            qlString+= " and  sf.type=:type ";
        }
        if(answerId != null){
            qlString+= " and sf.answerId=:answerId ";
        }
        qlString+=" order by sf.insertionDate";

        Query query = getEntityManagerFactory().createQuery(qlString);
        query.setParameter("userId", userId);
        if(pageType != null){
            query.setParameter("type", pageType);
        }
        if(answerId != null){
            query.setParameter("answerId", answerId);
        }
        return (List<UserAnswer>) query.getResultList();
    } catch (javax.persistence.NoResultException e) {
        return null;
    }
}
public List getUserAnswers(长userId、长answerId、字符串pageType){
试一试{
字符串qlString=“”
+“从用户应答sf中选择sf”
+“哪里”
+“sf.userId=:userId”;
如果(页面类型!=null){
qlString+=“和sf.type=:type”;
}
if(answerId!=null){
qlString+=“和sf.answerId=:answerId”;
}
qlString+=“按sf.insertionDate排序”;
Query Query=getEntityManagerFactory().createQuery(qlString);
setParameter(“userId”,userId);
如果(页面类型!=null){
query.setParameter(“类型”,页面类型);
}
if(answerId!=null){
setParameter(“answerId”,answerId);
}
return(List)query.getResultList();
}catch(javax.persistence.noresulte){
返回null;
}
}

你能帮我吗?提前感谢

您会得到一个异常,因为您需要绑定一个基元类型

试试这个:

 public Response updateUserAnswer(@PathVariable("userId") long userId,
             @RequestBody @Valid UserAnswer userAnswer) { [...] }

错误发生在
query.setParameter(“userId”,userId)因为当hqlQuery需要整数时,您试图设置一个Long

解决方案:

  • 将类型
    Long
    ->
    Integer
    从控制器更改为存储库

  • 使用
    .intValue()
    (与其说是解决方案,不如说是快速修复)

  • 将实体中的ID更改为长类型


请向您显示URL。当方法需要很长时间时,为什么预期的类型是整数?@StanislavL我编辑了我的问题并添加了服务代码,我认为这就是错误发生的地方。如果在控制器updateUserAnswer(@PathVariable(“userId”)中更改为整数,会发生什么情况Integer userId,我认为错误发生在服务层,我编辑了问题并添加了itI,这会让我感到惊讶。异常是explicit。参数与预期不匹配。在调用服务之前放置一个调试断点。我认为您的代码永远不会停止。我添加了一个打印,它确实到达了服务,所以控制器没有问题您知道您的服务到底在哪里抛出异常吗?我认为您的服务中的函数可能期望一个整数作为参数,但您给出了一个Long。好的,因此错误发生在这一行:List currentUserAnswer=userAnswerRepo.getUserAnswers(answerId,UserAnswerId.getAnswerId().longValue()),null);
UserAnswer.answerId
类型为整数或长(在您的实体中)?
UserAnswer.userId类型
为整数或长(在您的实体中)?在实体中它们都是int,错误正好发生在这一行:query.setParameter(“userId”,userId);@Daminox