我正在研究基于REST的API,并且在确定表示父/子关系的规范方法时遇到一些麻烦.(我在CXF中编写bean并使用JAX-RS和JAXB.我从CXF提供的基本示例开始)
我的问题是让你说你有一个Foo和一个酒吧.与Foo和Bar有一个1-N的关系,即1 Foo有很多Bars.我的问题是,找出Bars a Foo有什么规范方法是什么?访问Foo拥有的Bar资源的规范方法是什么?
我已经想到了,例如我可能会将Foos列在:
并在以下单一操作:
PUT/UPDATE/DELETE http:// xxx/fooservice/foo / {fooid}
但是我如何列出Foo 121的条形码?我如何访问它们?我注意到,默认的JAXB marshaller似乎不输出集合只是bean的属性,所以如果Foo是:
Foo - String id - String name - Collection bars
JAXB输出如下:
<foo> <id> 123>/id> <name> foo name </ name> </ foo> < - 注意没有bars属性
这是有问题的,因为没有办法让客户合理地预期知道Foo有酒吧,除非它"只知道"(这对我来说似乎很糟糕).因此,虽然我可以设想使用以下方法获取条形列表:
获取http:// xxx/fooservice/foo/121/bars
如果实体的输出没有说明任何内容,客户如何知道Foo有Bars?现在假设客户端确实得到了列表,那么实体操作似乎是这样的:
GET/DELETE/UPDATE http:// xxx/fooservice/foo/121/bar/435
这将访问Foo 121拥有的Bar 435.
我正在使用JAX-RS学习REST,这个疑问刚出现在我脑海中:
由于Web服务旨在为以不同编程语言编写的可互操作的客户端提供服务,并且客户端仅使用URL来访问服务功能; 用于将文件上载到公共数据库的Web服务怎么样?
它会保存吗?如果Web服务无法控制客户端如何执行验证,那么Web服务如何避免被垃圾邮件超载?上传方法看起来与此类似:
@Path("/upload/{something}")
@Consumes("multipart/form-data")
@POST
public void uploadSomething(...) {
//...
}
Run Code Online (Sandbox Code Playgroud)
所以我怀疑上传是否是REST服务可以安全做的好事?
我想在子资源中注入一个商务服务bean,该子资源在专用类中定义并由子资源定位器传递.
一些示例代码:
根资源
@RequestScoped
@Path("service")
public class MyResource {
@Context
ResourceContext resourceContext;
// Sub resource locator
@Path("subservice")
public MySubResource locateToSubResource () {
// I don't want to create it myself.
return resourceContext.getResource(MySubResource.class);
}
}
Run Code Online (Sandbox Code Playgroud)相应的子资源
@RequestScoped
public class MySubResource {
// Note that businessBean itself consists of
// multiple ejbs that also need to be injected so that it can do its job!
@Inject
private BusinessBean businessBean;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String get () {
return businessBean.doStuff();
}
}
Run Code Online (Sandbox Code Playgroud)Jersey不会让CDI调用依赖项...请注意,资源是托管对象.否则甚至不可能在根资源中注入一个bean(这里我推动我的其他问题'查看计数以获得更多意见;-) …
有没有办法获得将被给定java.lang.reflect.Method的方法(带注释@Path)HttpServletRequest?
这是我的用例:我在Java EE中Filter,想要知道稍后将调用的方法是否使用其他特定注释进行注释.
(我正在使用RESTEasy 3.0.7)
我正在创建仅处理json的JAX-RS Web服务。我们正在使用JAX-RS 2.0和Netbeans8。所有JPA 2.1实体都有一个唯一的ID,该ID用于审核。它不是主键。一个实体可能具有其他关联实体的列表。我们需要确保实体和关联列表中的实体都具有相同的唯一ID。如果存在差异,则审核失败。
我正在尝试找出处理此验证的最佳方法...
我可以尝试使用反射,但这很慢而且很麻烦。
我可以创建一个写拦截器,确定实体的种类,从中获取唯一的ID,然后扫描任何对象列表以确定是否存在差异。我不喜欢这个想法,因为我必须编写代码来验证模型中的每个特定实体,并在模型发生更改时维护该代码。
我最喜欢的选择是拦截在返回给请求者之前生成的json。我可以简单地标记字符串并找到唯一的id值。如果有任何不同,我会抛出异常。这假定正在使用急切加载,这是我能想到的唯一缺点,因为这意味着我们必须始终返回完整的有效负载,而不仅仅是返回实体。对于此项目,我尝试使用写拦截器,但发现该实体尚未序列化为json。因此,我对如何在返回给调用者之前截获json感到困惑。
我非常感谢您提出的关于实现我的目标的最佳选择的建议。
感谢您的关注,建议和时间。
麦克风
我正在尝试实现自己的ContainerRequestFilter配置SecurityContext.它在jax-rs资源上运行良好,但EJB jax-rs抛出javax.ejb.AccessLocalException
我发现只有相关的东西是4岁,而且解决方法似乎并不漂亮. https://java.net/projects/jersey/lists/users/archive/2010-05/message/265
我的自定义SecurityContext:
@Provider
@PreMatching
public class SecurityFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext filterContext) throws IOException {
filterContext.setSecurityContext(new Authorizer());
}
public class Authorizer implements SecurityContext {
public Principal getUserPrincipal() {
return null;
}
public boolean isUserInRole(String role) {
return true;
}
public boolean isSecure() {
return false;
}
public String getAuthenticationScheme() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
经测试的资源(无@Stateless)
@Path("test")
@Stateless
public class TestSecureResource {
@GET
@RolesAllowed("admin")
@Path("admin")
public Response secureTest() { …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用java,JAX-RS和Jersey重新创建用于创建REST的最优秀的vogella教程.
我正在使用带有Java-EE透视的eclipse Kepler,tomcat 7.0.
我已经创建了Todo类,带有相应注释的TodoResource类并部署在tomcat 7上.我已按照指示将jaxrs-ri库导入WEB-INF/lib文件夹.
Todo类:
package com.vogella.jersey.jaxb.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Todo {
private String summary;
private String description;
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Run Code Online (Sandbox Code Playgroud)
带注释的TodoResource:
package com.vogella.jersey.jaxb.model;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/todo")
public class TodoResource {
// This method is called if XMLis request
@GET …Run Code Online (Sandbox Code Playgroud) 我试图映射yes/no,true/false,Y/N在JAX-RS网址查询参数一个布尔值,但它仅映射true/false所有其他的值映射到错误的所有的时间成功.
我理解在映射url查询参数时,jAX-RS会尝试查找获取字符串参数的给定数据类型构造函数,并根据构造函数的操作将查询参数转换为声明的数据类型的对象.Boolean类确实true/TRUE为true,并将所有其他值视为false.
有没有一种方法来映射yes/no, y/n以true/false?
是否可以为resteasy客户端注册自定义Jackson JSON序列化程序?
我试过做类似的事情:
ResteasyClient client = new ResteasyClientBuilder()
.register(new CustomSerializer())
.build();
Run Code Online (Sandbox Code Playgroud)
但它没有用.有任何想法吗?
有没有办法通过拦截器向请求添加标头,但是当使用JAX RS Client API时,不能通过显式设置标头:
Client client = ClientBuilder.newClient();
Response response = client.target("someUrl").path("somePath").request().get();
Run Code Online (Sandbox Code Playgroud)
在AOP方式
jax-rs ×10
java ×5
java-ee ×3
jersey-2.0 ×3
rest ×3
json ×2
resteasy ×2
aop ×1
ejb ×1
glassfish-4 ×1
interceptor ×1
jersey ×1
tomcat ×1
web-services ×1