【问题标题】:CRUD/Restful API - > GET/DELETE doesn't workCRUD/Restful API - > GET/DELETE 不起作用
【发布时间】:2015-01-06 22:06:41
【问题描述】:

我的 API 有问题,我创建了一个新的实体、DAO、服务和控制器。 POST(addEmployer) 和 GET(findEveryEmployer) 没有问题。但是通过ID查找和通过ID删除的那些不起作用,我找不到错误。我正在使用邮递员测试我的宁静服务,“api/praktykodawcy/1”GET 或 DELETE 显示 NOT_FOUND(是的,数据库中至少有 2 名员工具有正确的 id)

这是控制器的代码

@Controller
@RequestMapping(value = "/praktykodawcy")
public class PraktykodawcyController {

    private iPraktykodawcyService ipraktykodawcyService;

    @Autowired
    PraktykodawcyController(iPraktykodawcyService ipraktykodawcyService) {
        this.ipraktykodawcyService = ipraktykodawcyService;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<PraktykodawcyEntity> addEmployeer (@RequestBody PraktykodawcyEntity praktykodawcyEntity) throws Exception {
        try {
            PraktykodawcyEntity newEmployeer = ipraktykodawcyService.addEmployeer(praktykodawcyEntity);
            return new ResponseEntity<PraktykodawcyEntity>(newEmployeer, HttpStatus.CREATED);
        }
        catch (Exception e){
            throw new Exception(e);
        }
    }

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<List<PraktykodawcyEntity>> findEveryEmployeer () {
        List<PraktykodawcyEntity> list = ipraktykodawcyService.findEveryEmployeer();
        return new ResponseEntity<List<PraktykodawcyEntity>>(list, HttpStatus.OK);
    }

    @RequestMapping(value = "/{idPraktykodawcy}", method = RequestMethod.GET)
    public ResponseEntity<PraktykodawcyEntity> findByIdPraktykodawcy(@PathVariable int idPraktykodawcy) {
        PraktykodawcyEntity praktykodawcyEntity = ipraktykodawcyService.findEmployeer(idPraktykodawcy);
        if(praktykodawcyEntity !=null) {
            return new ResponseEntity<PraktykodawcyEntity>(praktykodawcyEntity, HttpStatus.OK);
        }
        else {
            return new ResponseEntity<PraktykodawcyEntity>(HttpStatus.NOT_FOUND);
        }
    }

    @RequestMapping(value = "/{idPraktykodawcy}", method = RequestMethod.DELETE)
    public ResponseEntity<PraktykodawcyEntity> deleteEmployeer(@PathVariable int idPraktykodawcy) {
        PraktykodawcyEntity praktykodawcyEntity = ipraktykodawcyService.deleteEmployeer(idPraktykodawcy);
        if(praktykodawcyEntity !=null) {
            return new ResponseEntity<PraktykodawcyEntity>(praktykodawcyEntity, HttpStatus.OK);
        }
        else {
            return new ResponseEntity<PraktykodawcyEntity>(HttpStatus.NOT_FOUND);
        }
    }
}

服务:

@Service
@Transactional
public class PraktykodawcyService implements iPraktykodawcyService {

    @Autowired
    private iPraktykodawcyDAO ipraktykodawcyDAO;

    @Override
    public PraktykodawcyEntity addEmployeer(PraktykodawcyEntity praktykodawcyEntity) {
        return ipraktykodawcyDAO.addEmployeer(praktykodawcyEntity);
    }

    @Override
    public PraktykodawcyEntity updateEmployeer(int idPraktykodawcy, PraktykodawcyEntity praktykodawcyEntity) {
        return ipraktykodawcyDAO.updateEmployeer(idPraktykodawcy, praktykodawcyEntity);
    }

    @Override
    public PraktykodawcyEntity deleteEmployeer(int idPraktykodawcy) {
        return ipraktykodawcyDAO.deleteEmployeer(idPraktykodawcy);
    }

    @Override
    public PraktykodawcyEntity findEmployeer(int idPraktykodawcy) {
        return ipraktykodawcyDAO.findEmployeer(idPraktykodawcy);
    }

    @Override
    public List<PraktykodawcyEntity> findEveryEmployeer() {
        return ipraktykodawcyDAO.findEveryEmployeer();
    }

    @Override
    public List<PraktykodawcyEntity> findByIdAdresu(int idAdresu) {
        return ipraktykodawcyDAO.findByIdAdresu(idAdresu);
    }
}

和 DAO

@Repository
public class PraktykodawcyDAO implements iPraktykodawcyDAO {
@PersistenceContext
EntityManager em;

@Override
public PraktykodawcyEntity addEmployeer(PraktykodawcyEntity praktykodawcyEntity) {
    em.persist(praktykodawcyEntity);
    return praktykodawcyEntity;
}

@Override
public PraktykodawcyEntity updateEmployeer(int idPraktykodawcy, PraktykodawcyEntity praktykodawcyEntity) {
    em.merge(praktykodawcyEntity);
    return praktykodawcyEntity;
}

@Override
public PraktykodawcyEntity deleteEmployeer(int idPraktykodawcy) {
    PraktykodawcyEntity praktykodawcyEntity = em.find(PraktykodawcyEntity.class, idPraktykodawcy);
    if(praktykodawcyEntity !=null) {
        em.remove(praktykodawcyEntity);
        return praktykodawcyEntity;
    }
    else {
        return null;
    }
}

@Override
public PraktykodawcyEntity findEmployeer(int idPraktykodawcy) {
    return em.find(PraktykodawcyEntity.class, idPraktykodawcy);

}

@Override
public List<PraktykodawcyEntity> findEveryEmployeer() {
    Query query = em.createQuery("SELECT e FROM PraktykodawcyEntity e");
    return query.getResultList();
}

@Override
public List<PraktykodawcyEntity> findByIdAdresu(int idAdresu) {
    Query query = em.createQuery("SELECT e FROM PraktykodawcyEntity e WHERE e.adresyByIdAdresu.idAdresu=?1");
    query.setParameter(1, idAdresu);
    return query.getResultList();
}

}

【问题讨论】:

  • 此时附加调试器会更有成效。 404 在您确定您已创建的静止资源上意味着它没有正确持久化或您没有正确检索它。
  • 你调试过这个吗?
  • 你的控制器代码执行了吗?如果是这样, id 字段的值是多少?数据库中真的存在这个id的实体吗?
  • 老实说,我从来没有调试过我的宁静服务,只使用了邮递员插件。我检查了我的 POST 方法并且它有效,GET(findEveryEmployer) 显示 2 个 id = 1 和 id = 2 的雇主,我什至用 pgadmin (SELECT * FROM praktykodawcy WHERE id_praktykodawcy=1) 检查了我的数据库,它显示正确雇主。邮递员示例:{ "idPraktykodawcy": 1, "nazwa": "Microsoft", "nazwaDzialalnosci": "software engineering", "zaufany": true, "idAdresu": null, "adresyByIdAdresu": null },
  • 是的,但调试会确认 id 1 是否已成功传递给您的 DAO。可以说记录在数据库中,但是当您将这个 id 传递给它时,您还没有验证您的代码在做什么。如果您不熟悉使用调试器,请添加一些控制台输出语句。

标签: java spring rest jpa crud


【解决方案1】:

您需要将变量名称赋予@PathVariable 注释。 试试这个:

public ResponseEntity<PraktykodawcyEntity> 
    findByIdPraktykodawcy(@PathVariable("idPraktykodawcy") int idPraktykodawcy)

【讨论】:

  • 仍然无法正常工作,我已经制作了 2 个其他具有双关系的实体,没有像您这样的注释并且它们可以工作。我可以向您展示它们的样子,我已经盯着这段代码 2 个小时了,仍然没有,我认为它们看起来几乎相同,除了 DAO 的其他名称、实体等
  • 是时候拿出调试器了 :)
【解决方案2】:

好的,伙计们,我发现了问题所在,首先我在代码中创建了几个 prinln 来检查 id 是否通过所有模块正确传递,一切都是正确的。但后来我检查了实体,发现 @OneToMany 没有被评论,它正在搜索与另一个实体的这种关系,但是那个实体得到了它的 @ManyToOne 评论并且休眠并没有对这样的事情大喊大叫。现在一切正常,现在要让这个双变量工作,感谢大家快速回答。

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多