Jua*_*ego 3 java jax-rs resteasy
将corsfilter添加到ApplicationPath后,我无法访问任何服务
这是一个例子
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.jboss.resteasy.plugins.interceptors.CorsFilter;
@ApplicationPath("/")
public class JaxRsActivator extends Application {
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> classes = new HashSet<Class<?>>();
public JaxRsActivator() {
CorsFilter corsFilter = new CorsFilter();
corsFilter.getAllowedOrigins().add("*");
corsFilter.setAllowedHeaders("Content-Type");
singletons.add(corsFilter);
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我卷曲,我会得到这个,
curl -i http://localhost:8080/unika/usuarios -H "Origin:otherdomain.com"
HTTP/1.1 404 Not Found
Connection: keep-alive
Access-Control-Allow-Origin: otherdomain.com
X-Powered-By: Undertow 1
Server: Wildfly 8
Access-Control-Allow-Credentials: true
Content-Length: 0
Date: Tue, 16 Jun 2015 16:18:15 GMT
Run Code Online (Sandbox Code Playgroud)
在服务器上我得到了这个
11:18:15,533 WARN [org.jboss.resteasy.core.ExceptionHandler](默认任务-10)无法执行:javax.ws.rs.NotFoundException:无法找到完整路径的资源:http:// localhost:8080 / unika / usuarios at org.jboss.resteasy.core.registry.ClassNode.match(ClassNode.java:73)[resteasy-jaxrs-3.0.10.Final.jar:]
如果我从代码中删除这一行:
CorsFilter corsFilter = new CorsFilter();
corsFilter.getAllowedOrigins().add("*");
corsFilter.setAllowedHeaders("Content-Type");
singletons.add(corsFilter);
Run Code Online (Sandbox Code Playgroud)
在评论这些行后,我得到以下卷曲
$ curl -i http://localhost:8080/unika/usuarios -H "Origin:otherdomain.com"
HTTP/1.1 200 OK
Connection: keep-alive
Cache-Control: no-cache
X-Powered-By: Undertow 1
Server: Wildfly 8
Transfer-Encoding: chunked
Content-Type: application/json
Date: Tue, 16 Jun 2015 16:21:09 GMT
["Bill Burke","Stian Thorgersen","Stan Silvert","Gabriel Cardoso","Viliam Rockai","Marek Posolda","Bol"]
Run Code Online (Sandbox Code Playgroud)
但我需要Access-Control-Allow-Origin
您必须手动更新其他服务的类,例如
classes.add(MyRestService.class);
这条线
corsFilter.setAllowedHeaders("Content-Type");
给了我访问控制 - 允许 - 标题的麻烦,所以我把那一行都搞定了.
可以配置JAX-RS应用程序,不包含web.xml和空子Application类@ApplicationPath.使用此类,这足以使您的JAX-RS应用程序被引导,并且JAX-RS运行时将扫描类路径以查找用@Path和注释的所有类@Provider,并自动向应用程序注册这些类.
@ApplicationPath("/api")
public class JaxRsApplication extends Application {}
Run Code Online (Sandbox Code Playgroud)
一旦覆盖getSingeletons()or getClasses()并在其中任何一个中返回非空集,就会通过类路径扫描禁用类的自动注册.由于您已经这样做,您的资源不再自动注册.所以现在你可以做几件事:
只需注册自动注册之前的资源类
classes.add(MyResource.class);
Run Code Online (Sandbox Code Playgroud)您可以查看此答案,该答案使用带Feature注释的@Provider.Feature由于类路径扫描,将注册.在此功能中,您可以注册CorsFilter用FeatureContext.