You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:58:15