当前位置: 首页 > 知识库问答 >
问题:

在泽西2.17中使用SelectableEntityfilter

沈曜灿
2023-03-14

我是新泽西州人,我尝试使用示例中的SelectableEntityFilteringFeature:http://blog.dejavu.sk/2015/02/04/jerseys-entity-filtering-meets-jackson/#selectable

我使用以下类/文件创建了一个小型服务:

名为PersonResource的资源文件。Java语言

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.message.filtering.SelectableEntityFilteringFeature;
import org.glassfish.jersey.server.ResourceConfig;

@Path("/")
@Produces("application/json")
public class PersonResource extends ResourceConfig{

    public PersonResource() {

        // Register all resources present under the package.
        packages("org.glassfish.jersey.examples.entityfiltering.selectable");

        // Register entity-filtering selectable feature.
        register(SelectableEntityFilteringFeature.class);
        property(SelectableEntityFilteringFeature.QUERY_PARAM_NAME, "select");

        // Configure MOXy Json provider. Comment this line to use Jackson. Uncomment to use MOXy.
        //register(new MoxyJsonConfig().setFormattedOutput(true).resolver());

        // Configure Jackson Json provider. Comment this line to use MOXy. Uncomment to use Jackson.
        register(JacksonFeature.class);

    }

    @GET
    @Path("person")
    public Person getPerson(){

        final Person person = new Person();
        person.setGivenName("Andrew");
        person.setFamilyName("Dowd");
        person.setHonorificPrefix("Mr.");
        person.setHonorificSuffix("PhD");

        return person;
    }
}

一个叫做Person.java的域

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Person {
    private String givenName;

    private String familyName;

    private String honorificSuffix;

    private String honorificPrefix;

    // same name as Address.region
    private String region;



    public String getGivenName() {
        return givenName;
    }

    public void setGivenName(String givenName) {
        this.givenName = givenName;
    }

    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

    public String getHonorificSuffix() {
        return honorificSuffix;
    }

    public void setHonorificSuffix(String honorificSuffix) {
        this.honorificSuffix = honorificSuffix;
    }

    public String getHonorificPrefix() {
        return honorificPrefix;
    }

    public void setHonorificPrefix(String honorificPrefix) {
        this.honorificPrefix = honorificPrefix;
    }
}

一张网。xml文件

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</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.servicetest.person.resources</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.examples.entityfiltering.selectable;org.glassfish.jersey.filter.LoggingFilter</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>
</web-app>

JSON的对象序列化也适用于Jackson和Moxy。但返回值的选择不起作用。我认为这个URL:

http://localhost:8080/person/service/person

应该只返回姓氏,但一切都是回报。我无法通过搜索互联网找到解决方案,但也许这里的任何人都可以告诉我我做错了什么。

共有1个答案

夔学智
2023-03-14

问题似乎是您对ResourceConfig的使用不正确。您可以查看ResourceConfig,作为使用web的替代方法。xml。它应该由将作为应用程序配置类服务器的类(而不是资源类)进行扩展。例如

@ApplicationPath("/service")
public class AppConfig extends ResourceConfig {
    public AppConfig() {
        packages("com.servicetest.person.resources");
        register(LoggingFilter.class);
    }
}

这是与web.xml类似的配置,其中@Application ationPath("/service")等价于

public AppConfig() {
    packages("com.servicetest.person.resources");
    register(LoggingFilter.class);

    register(SelectableEntityFilteringFeature.class);
    property(SelectableEntityFilteringFeature.QUERY_PARAM_NAME, "select");
    register(JacksonFeature.class);
}

如果你想坚持网络。xml,然后可以将该功能添加到提供程序类名列表中,即。

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>
        org.glassfish.jersey.filter.LoggingFilter,
        org.glassfish.jersey.message.filtering.SelectableEntityFilteringFeature,
        org.glassfish.jersey.jackson.JacksonFeature
    </param-value>
</init-param>

要设置查询选择器属性,请查看SelectableEntityFilteringFeature的字符串值的常量字段值。查询参数名称。您可以使用此值设置<代码>

<init-param>
    <param-name>jersey.config.entityFiltering.selectable.query</param-name>
    <param-value>select</param-value>
</init-param>

然后只需去掉个性化资源中的整个构造函数(并去掉ResourceConfig扩展),您就应该被设置了。

 类似资料:
  • 我对web服务非常陌生,所以我从基本示例开始。这与文件上传有关。我正在为非maven开发人员使用最新(2.17)版本的Jersey捆绑包。它指出: 捆绑包包含JAX-RS 2.0 API jar、所有核心泽西模块jar以及所有必需的第3方依赖项 .问题是我不能编译这部分: Jersey 2.17捆绑包中似乎不存在FormDataParam,尽管docs表示存在。2.17捆绑包是否不完整?如何解决此

  • 问题内容: 我是Web服务的新手,因此我从基本示例开始。这与文件上传有关。我正在为非Maven开发人员使用最新(2.17)版本的Jersey捆绑包。它指出: 捆绑包包含JAX-RS 2.0 API jar,所有核心Jersey模块jar以及所有必需的3rd-party依赖关系 。问题是我无法编译此部分: 尽管文档说确实存在,但似乎在Jersey 2.17软件包中并不存在。2.17捆绑包是否不完整?

  • 我有一个资源类 我尝试了泽西岛2.0的依赖注入中的答案 如果我使用 启动服务器时,我得到 如果我删除了上述依赖项,那么我得到 资源配置类是 活页夹类是 我在嵌入式模式下使用tomcat并添加init参数 我如何在控制器中注入服务?注入是单元测试的首选方式吗(当服务实现调用另一个服务时,比如说XService ),单元测试不应该依赖于Xservice,因此demoServiceImpl如何从测试中将

  • 我一直想知道JacksonFeature。泽西2.17仍然需要上课。我看不出JacksonFeature代码之间的输出有任何区别。类是否已注册。 然后,我从codingpedia中分叉了一个代码,删除了JacksonFeature.class,升级到Spring 4.1.2和jersey 2.17,更新了代码,测试仍然通过。 因此,我创建了一个非常简单的web服务来再次测试这个github链接,考

  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?