【问题标题】:Using SelectableEntityFiltering in Jersey 2.17在 Jersey 2.17 中使用 SelectableEntityFiltering
【发布时间】:2015-07-12 20:21:53
【问题描述】:

我是泽西岛的新手,我尝试使用示例中的 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;
    }
}

一个 web.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。但是返回值的选择不起作用。我认为这个网址:

http://localhost:8080/person/service/person&select=familyName

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

【问题讨论】:

    标签: java filter jersey jackson jersey-2.0


    【解决方案1】:

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

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

    这是与您的 web.xml 类似的配置,其中@ApplicationPath("/service") 等同于&lt;url-pattern&gt;,而packages(..) 的用途与您的&lt;init-param&gt; 相同。为了让这个类像上面的例子一样工作,你应该在 web.xml 中注释掉整个 servlet 定义。然后你可以添加属性和特性到构造函数

    public AppConfig() {
        packages("com.servicetest.person.resources");
        register(LoggingFilter.class);
    
        register(SelectableEntityFilteringFeature.class);
        property(SelectableEntityFilteringFeature.QUERY_PARAM_NAME, "select");
        register(JacksonFeature.class);
    }
    

    如果您想坚持使用 web.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>
    

    对于设置查询选择器属性,请查看Constant Field Values 以获取SelectableEntityFilteringFeature.QUERY_PARAM_NAME 的字符串值。您可以使用此值设置&lt;init-param&gt;

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

    然后只需去掉 PersonResource 中的整个构造函数(并去掉 ResourceConfig 扩展名),就应该设置好了。

    【讨论】:

    • 非常感谢你。我误解了 ResourceConfig 的含义。现在它很清楚并且效果很好。谢谢!
    • 嗨,阿德里安,我正在尝试相同的用例,我没有得到过滤,你能分享你的代码吗?
    • 每当我在 ResourceConfig 实现的构造函数中注册功能时,我对我的 rest 应用程序发出的每个请求都会奇怪地收到 404 错误。任何想法为什么会这样?
    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 2015-08-02
    • 1970-01-01
    • 2015-05-28
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    相关资源
    最近更新 更多