Java toResponse in jersey ExceptionMapper未被调用

Java toResponse in jersey ExceptionMapper未被调用,java,rest,exception,jersey,provider,Java,Rest,Exception,Jersey,Provider,因此,我正在构建一个web应用程序,我们使用JPA和Jersey来消费/生成JSON数据 我有一个自定义的“EntityException”和一个自定义的“EntityExceptionMapper” 这是地图绘制者: @Provider public class EntityExceptionMapper implements ExceptionMapper<EntityException> { public EntityExceptionMapper() {

因此,我正在构建一个web应用程序,我们使用JPA和Jersey来消费/生成JSON数据

我有一个自定义的“EntityException”和一个自定义的“EntityExceptionMapper”

这是地图绘制者:

  @Provider
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {

    public EntityExceptionMapper() {
        System.out.println("Mapper created");
    }

    @Override
    public Response toResponse(EntityException e) {
        System.out.println("This doesnt print!");
        return Response.serverError().build();
    }
}
我从一个REST通话中调用它:

@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String test() throws EntityException{
    throw new EntityException("This needs to be send as response!!");
    //return "test";
}
我的问题是,当抛出上述异常时,我会进入构造函数(prints:“This prints…”)Edit:我还会得到:“Mapper created!”

但是我的响应是空的,我不能通过我的响应方法访问系统。这与泽西岛网站上的示例非常相似:


我遗漏了什么?

我遇到了一个类似的问题,
例外标记
有正确的
@Provider
注释,其余代码与Jersey的示例相同,但仍然没有正确注册

事实证明,我必须使用
addExceptionMapper
方法在我的
HttpServlet
中手动注册我的自定义
ExceptionMapper
。由于现在已手动注册,
@Provider
注释可以安全删除

因此,使用以下ExceptionMapper(我捕获每个
RuntimeException
,将它们重新命名为400)

公共类MyCustomExceptionHandler实现ExceptionMapper{
@凌驾
响应的公共响应(运行时异常){
返回Response.status(status.BAD_REQUEST).entity(exception.getMessage()).build();
}
}
我必须在init中添加第二行:

HttpServlet serviceServlet = jerseyServletFactory.create(someResource);
jerseyServletFactory.addExceptionMapper(new MyCustomExceptionHandler()); //<--

httpServer.register(serviceServlet, "/api");
httpServer.start();
HttpServlet-serviceServlet=jerseyServletFactory.create(someResource);
addExceptionMapper(新的MyCustomExceptionHandler())// 我使用spring连接jersey应用程序,并使用@Component和@Provider

当我搬到泽西v>2.5时,它停止工作了

我通过将@Singleton注释而不是@Component与@Provider放在一起解决了这个问题,如下所示:

@Provider
@Singleton
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {...
@Provider
@独生子女
公共类EntityExceptionMapper实现ExceptionMapper{。。。

我正在使用与部署无关的应用程序模型,因此以下内容适用于我:

public class MyApplication extends Application {
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(HelloWorldResource.class);

        /** you need to add ExceptionMapper class as well **/
        s.add(EntityExceptionMapper.class)
        return s;
    }
}
公共类MyApplication扩展应用程序{

public Set>s=new HashSet我正在使用Jersey
JdkHttpServerFactory
,我只需要添加
ExceptionMapper
类作为资源,就像我的其他控制器资源一样:

import com.sun.net.httpserver.HttpServer;
import javax.ws.rs.core.UriBuilder;
import java.net.URI;
import java.util.HashSet;
import java.util.Set;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

// ...

Set<Class> resources = new HashSet<>();
// Add whatever other resource classes you have...

//--->>> Add the exception mapper <<<---
resources.add(EntityExceptionMapper.class);

ResourceConfig resources = new ResourceConfig(resources);
URI uri = UriBuilder.fromUri("http://localhost/").build();
HttpServer server = JdkHttpServerFactory.createHttpServer(uri, resources);
导入com.sun.net.httpserver.httpserver;
导入javax.ws.rs.core.UriBuilder;
导入java.net.URI;
导入java.util.HashSet;
导入java.util.Set;
导入org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
导入org.glassfish.jersey.server.ResourceConfig;
// ...
Set resources=new HashSet();
//添加您拥有的任何其他资源类。。。

//--->>>添加异常映射器我仍然使用jersey 1.17、spring和jersy spring


@Component annotation修复了这个问题

我也遇到了同样的问题,可以通过将jersey.config.server.provider.packages中的ExceptionMapper包包含在我的web.xml文件中来修复它

<servlet>
    <servlet-name>voteride-servlet</servlet-name>
    <servlet-class>
        org.glassfish.jersey.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>
            com.voteride.ws;com.voteride.errorHandling;org.codehaus.jackson.jaxrs
        </param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.scanning.recursive</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

voteride servlet
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.voteride.ws;com.voteride.errorHandling;org.codehaus.jackson.jaxrs
jersey.config.server.provider.scanning.recursive
假的
1.

我也遇到了同样的问题。我只需要修改web.xml。 以前在我的web.xml文件中,param值是
com.two95.restful.resource
我刚改为root包
com.two95.restful
。然后它开始像一个魔咒一样工作,只需要
@Provider
注释

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.two95.restful</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Jersey Web应用程序
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.two95.restful
1.

我也面临同样的问题。只需添加包含ExceptionAppPerHandler类的包名即可

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>Service,Utilities.ExceptionMapper</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

Jersey Web应用程序
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
服务,公用设施。例外情况
1.
Jersey Web应用程序
/*
这里,服务包含所有服务类和实用程序。ExceptionMapper包含所有ExceptionMapper。
希望它的帮助

尝试在X extends ResourceConfig文件中注册异常映射器类。 注册(CustomExceptionMapper.class);
这一行将帮助应用程序找到您的映射器类,并返回您在映射器类的toResponse方法中编写的任何内容

我在开发示例REST API时遇到了相同的问题。在创建REST API时,我给出了基本包名,如org.manish.REST.message, 我应该像这样在基本包下创建其他包

 <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.manish.rest.message</param-value>
 </init-param>

  • model-
    org.manish.rest.message.model
  • 数据库-
    org.manish.rest.message.database
  • resource-
    org.manish.rest.message.resource
  • 在web.xml中,init参数是这样给出的

     <init-param>
                <param-name>jersey.config.server.provider.packages</param-name>
                <param-value>org.manish.rest.message</param-value>
     </init-param>
    
    
    jersey.config.server.provider.packages
    org.manish.rest.message
    

    这意味着,我已经在Web.xml中注册了我的基础包,我将在这个基础上创建什么样的包;将基于JAX-RS根据我的调用和需求来考虑。但是当我错误地创建了我的异常包时,我把包名Or.MasiH.RES.Exabl放在了这里,因为这不是在Web.xml中注册的,所以我的完全异常类没有考虑。通过JAX-RS处理异常。 作为更正,我刚刚修改了

    org.manish.rest.exception
    to
    org.manish.rest.message.exception

    在那之后,我在《邮差》中执行了一次,并得到了预期的结果

    希望这能解决你的疑问 <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>org.manish.rest.message</param-value> </init-param>