Java JAX-RS:如何扩展应用程序类来扫描包?
目前,我做了一些类似于Java JAX-RS:如何扩展应用程序类来扫描包?,java,rest,jersey,jax-rs,resteasy,Java,Rest,Jersey,Jax Rs,Resteasy,目前,我做了一些类似于 import javax.annotation.Nonnull; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import java.util.Collections; import java.util.HashSet; import java.util.Set; @ApplicationPath("oauth") public class OAuthApplicati
import javax.annotation.Nonnull;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@ApplicationPath("oauth")
public class OAuthApplication extends Application {
final Set<Class<?>> classes = new HashSet<>();
@Nonnull
@Override
public Set<Class<?>> getClasses() {
classes.add(RegisterResource.class);
return Collections.unmodifiableSet(classes);
}
}
十次,它是乏味的,有时也是健忘的
JAX-RS
或RESTEasy
是否提供了一种方法,以便我可以提及包名并在其下扫描类
我知道《泽西》有这样的东西
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("org.foo.rest;org.bar.rest");
}
}
有什么想法/想法吗
更新
似乎我们可以在web.xml
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
轻松扫描
真的
是否有特定的
Java
等价物?是所有应用程序类、ResourceClass和@ApplicationPath的组合
与一致,并且类通过jersey实现,其实现方式是:
@ApplicationPath(value = "/resource")
public class ApplicationREST extends ResourceConfig {
public ApplicationREST() {
//add single resources
register(SimpleResource1.class);
register(SimpleResource2.class);
...
//enable multipar feature
register(MultiPartFeature.class);
...
//enable scan package and recursive
packages(true, "com.example.rest");
}
}
我希望这对你有帮助
“是否有特定的Java等价物?”
只需将类保留为空,这意味着不要覆盖getClasses()
或getSingletons()
:
[……]
在后两种情况下,如果Application.getClasses
和Application.getSingletons
都返回空列表,则web应用程序中打包的所有根资源类和提供程序都必须包含在已发布的JAX-RS应用程序中。如果getClasses
或getsingleton
返回非空列表,则发布的JAX-RS应用程序中必须只包含返回的那些类或单例
所以你可以简单的做
@ApplicationPath("oauth")
public class OAuthApplication extends Application {}
您的类路径将被扫描为@Path
和@Provider
类。重写任一方法(返回一个非空集),并且只添加那些类
还应该注意的是,publicmap getProperties()
可以被安全覆盖。您可以使用它添加任意属性(甚至注册类/功能),或者如果您需要配置提供程序,您可以在功能
或动态功能
中这样做,因为它非常简单:
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/webapi")
public class MyApp extends Application {
}
这将扫描带有@Provider和@Path注释的所有类 也许这应该是一个单独的问题,但我发现,使用这里建议的解决方案,我的JAX-RS应用程序不会自动获取一些注册的ExceptionMapper提供程序,这些提供程序驻留在EAR中一个单独的EJB包中,该包也包含WAR。我不希望像OP所指出的那样显式地添加每个类,但确实需要Jersey提供的那种“添加包”快捷方式,而且仍然找不到使用RESTEasy实现这一点的方法。有什么想法吗?似乎我需要一个不同的问题,因为在重写的getClasses()方法中显式添加所有类实际上也不起作用。也没有将它们注册为功能。这些ExceptionMapper提供者一定有一些特别之处。嗯…有点进步。。。Wildfly日志表明,似乎未正确处理的异常之一是EJBException:ERROR[io.undertow.request](默认任务-121)UT005023:Exception handling request to/rest/authenticate:org.jboss.resteasy.spi.UnhandledException:javax.ejb.EJBException:io.jsonwebtoken.ExpiredJwtException。为EJBException添加ExceptionMapper确实允许我处理此异常,但我不完全理解为什么会发生这种情况,因为在我的EJB包(而不是WAR)中抛出的过期JWTException没有显示此问题。最后,我的问题是由于如何取消选中(系统)异常由EJBException中的容器包装(请参阅)。在我的例子中,解决方案是在ejb-jar.xml中表示io.jsonwebtoken.ExpiredJwtException,使其成为应用程序(已检查)异常。我使用了它,但最初,它给了我500,表示没有注册MultiPartFeature,注册后,它给了404,表示我所有的API。有什么想法吗?
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/webapi")
public class MyApp extends Application {
}