标签: jax-rs

如何通过REST和JAX-RS为父子实体建模

我正在研究基于REST的API,并且在确定表示父/子关系的规范方法时遇到一些麻烦.(我在CXF中编写bean并使用JAX-RS和JAXB.我从CXF提供的基本示例开始)

我的问题是让你说你有一个Foo和一个酒吧.与Foo和Bar有一个1-N的关系,即1 Foo有很多Bars.我的问题是,找出Bars a Foo有什么规范方法是什么?访问Foo拥有的Bar资源的规范方法是什么?

我已经想到了,例如我可能会将Foos列在:

获取http:// xxx/fooservice/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.

rest jax-rs

4
推荐指数
1
解决办法
3592
查看次数

使用REST Web服务上传文件是个好主意吗?

我正在使用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服务可以安全做的好事?

java rest web-services jax-rs jersey

4
推荐指数
1
解决办法
739
查看次数

Jersey:如何将EJB注入子资源?

我想在子资源中注入一个商务服务bean,该子资源在专用类中定义并由子资源定位器传递.

一些示例代码:

  1. 根资源

    @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)
  2. 相应的子资源

    @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(这里我推动我的其他问题'查看计数以获得更多意见;-) …

dependency-injection ejb jax-rs jersey-2.0

4
推荐指数
1
解决办法
1426
查看次数

如何获取给定JAX-RS请求的目标方法?

有没有办法获得将被给定java.lang.reflect.Method的方法(带注释@Path)HttpServletRequest

这是我的用例:我在Java EE中Filter,想要知道稍后将调用的方法是否使用其他特定注释进行注释.

(我正在使用RESTEasy 3.0.7)

introspection jax-rs resteasy

4
推荐指数
1
解决办法
1800
查看次数

JAX-RS:如何在发送响应之前拦截json消息正文?

我正在创建仅处理json的JAX-RS Web服务。我们正在使用JAX-RS 2.0和Netbeans8。所有JPA 2.1实体都有一个唯一的ID,该ID用于审核。它不是主键。一个实体可能具有其他关联实体的列表。我们需要确保实体和关联列表中的实体都具有相同的唯一ID。如果存在差异,则审核失败。

我正在尝试找出处理此验证的最佳方法...

我可以尝试使用反射,但这很慢而且很麻烦。

我可以创建一个写拦截器,确定实体的种类,从中获取唯一的ID,然后扫描任何对象列表以确​​定是否存在差异。我不喜欢这个想法,因为我必须编写代码来验证模型中的每个特定实体,并在模型发生更改时维护该代码。

我最喜欢的选择是拦截在返回给请求者之前生成的json。我可以简单地标记字符串并找到唯一的id值。如果有任何不同,我会抛出异常。这假定正在使用急切加载,这是我能想到的唯一缺点,因为这意味着我们必须始终返回完整的有效负载,而不仅仅是返回实体。对于此项目,我尝试使用写拦截器,但发现该实体尚未序列化为json。因此,我对如何在返回给调用者之前截获json感到困惑。

我非常感谢您提出的关于实现我的目标的最佳选择的建议。

感谢您的关注,建议和时间。

麦克风

java json jax-rs java-ee

4
推荐指数
1
解决办法
1751
查看次数

EJB jax-rs资源上的Jersey自定义SecurityContext

我正在尝试实现自己的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)

jax-rs java-ee glassfish-4 jersey-2.0

4
推荐指数
1
解决办法
4861
查看次数

MessageBodyWriter找不到vogella教程

我正在尝试使用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)

java json tomcat jax-rs jersey-2.0

4
推荐指数
1
解决办法
9935
查看次数

在ReST API查询参数中将是/否映射到布尔值

我试图映射yes/no,true/false,Y/N在JAX-RS网址查询参数一个布尔值,但它仅映射true/false所有其他的值映射到错误的所有的时间成功.

我理解在映射url查询参数时,jAX-RS会尝试查找获取字符串参数的给定数据类型构造函数,并根据构造函数的操作将查询参数转换为声明的数据类型的对象.Boolean类确实true/TRUE为true,并将所有其他值视为false.

有没有一种方法来映射yes/no, y/ntrue/false

rest jax-rs

4
推荐指数
1
解决办法
5362
查看次数

定制杰克逊序列化的resteasy客户端

是否可以为resteasy客户端注册自定义Jackson JSON序列化程序?

我试过做类似的事情:

ResteasyClient client = new ResteasyClientBuilder()
            .register(new CustomSerializer())
            .build();
Run Code Online (Sandbox Code Playgroud)

但它没有用.有任何想法吗?

java jax-rs java-ee resteasy

4
推荐指数
1
解决办法
7282
查看次数

JAX RS Client API拦截器

有没有办法通过拦截器向请求添加标头,但是当使用JAX RS Client API时,不能通过显式设置标头:

Client client = ClientBuilder.newClient();
Response response = client.target("someUrl").path("somePath").request().get();
Run Code Online (Sandbox Code Playgroud)

在AOP方式

java aop jax-rs interceptor

4
推荐指数
1
解决办法
1004
查看次数