Java toResponse in jersey ExceptionMapper未被调用
因此,我正在构建一个web应用程序,我们使用JPA和Jersey来消费/生成JSON数据 我有一个自定义的“EntityException”和一个自定义的“EntityExceptionMapper” 这是地图绘制者: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() {
@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我正在使用JerseyJdkHttpServerFactory
,我只需要添加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
toorg.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>