Java JAX-RS服务POST空日期空指针异常及search路径REST类实现问题
问题二:处理/search/*路径REST请求的实现指导
先看你的配置和代码,有几个关键点需要调整和完善:
1. 修正Jersey版本的JSON配置冲突
你web.xml里用的com.sun.jersey.api.json.POJOMappingFeature是Jersey 1.x的配置,但代码里用的是com.fasterxml.jackson(Jersey 2.x默认依赖的是Jackson 2),这会导致JSON序列化/反序列化异常。把web.xml里的这个参数替换成Jersey 2.x的Jackson配置:
<init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value> </init-param>
同时确保你的项目依赖里包含Jersey 2.x的Jackson包:org.glassfish.jersey.media:jersey-media-json-jackson。
2. 完善SearchController的代码实现
你的Controller已经在正确的包下,@Path("")也没问题(因为servlet-mapping是/search/*,所以这个Controller会处理/search下的所有子路径),接下来完善核心逻辑:
优化EntityManager的初始化
不要每次请求都创建EntityManagerFactory,这非常耗资源,建议在构造函数里初始化一次:@Path("") public class SearchController { private final ObjectMapper mapper; private final EntityManagerFactory emf; public SearchController() { mapper = new ObjectMapper(); // 这里的"your-persistence-unit"要对应你persistence.xml里的持久化单元名称 emf = Persistence.createEntityManagerFactory("your-persistence-unit"); } @POST @Path("incidents") // 子路径,比如请求地址是http://your-domain/search/incidents @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public List<Incident> searchIncidents(Incident searchCriteria) { EntityManager em = emf.createEntityManager(); try { CriteriaBuilder cb = em.getCriteriaBuilder(); // 这里写你的查询逻辑,比如根据searchCriteria构建查询条件 // 示例: // CriteriaQuery<Incident> query = cb.createQuery(Incident.class); // Root<Incident> root = query.from(Incident.class); // 条件拼接... // List<Incident> result = em.createQuery(query).getResultList(); return new ArrayList<>(); // 替换成实际查询结果 } finally { em.close(); // 一定要关闭EntityManager } } }添加异常处理
可以写一个异常映射器,把NPE等异常转换成友好的HTTP响应:import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @Provider public class GlobalExceptionMapper implements ExceptionMapper<Exception> { @Override public Response toResponse(Exception e) { if (e instanceof NullPointerException) { return Response.status(Response.Status.BAD_REQUEST) .entity("请求参数包含无效的空值,请检查输入") .type(MediaType.TEXT_PLAIN) .build(); } return Response.status(Response.Status.INTERNAL_SERVER_ERROR) .entity("服务器内部错误") .type(MediaType.TEXT_PLAIN) .build(); } }
3. 测试验证
启动服务后,发送POST请求到http://your-domain/search/incidents,请求体用Incident的JSON格式(包含空日期字段),就能触发你的搜索逻辑了。
内容的提问来源于stack exchange,提问作者mixtou
相关产品推荐
相关产品推荐

