我有一个Web API,用户可以(或可能不)传输URL参数,例如鸟,狗等.

我希望此参数映射到服务器端的枚举,如:

@POST
@Path("/zoo")
public Response createNewAnimal(
                        @QueryParam("animal") 
                        @DefaultValue("CAT") AnimalType type 
                ) throws Exception 

...

public enum AnimalType {
    BIG_BIRD,SMALL_CAT;
}

但它不起作用!

在处理Web请求时,正在调用Enum.valueOf().当然它失败了,因为用户用作URL参数的鸟与Enum(AnimalType.BIG_BIRD)中的标识符不匹配.

没有办法覆盖valueOf()方法(它是静态的……),并且设置构造函数没有帮助(它是相反的逻辑方向).

所以也许你知道一个很好的解决方案,而不是只使用if … else …?

解决方法

如果你有一个枚举像:
public enum AnimalType {
    BIG_BIRD,SMALL_CAT,MEDIUM_DOG;
}

然后,为了让JAX-RS知道要返回的实例,您的查询参数必须是?animal = BIG_BIRD,?animal = SMALL_CAT或?animal = MEDIUM_DOG.

查询参数的值被送到枚举的valueOf静态方法以获取实例.当然,如果你发送像鸟一样的东西它将无法匹配任何东西,它将无法正常工作,因为@QueryParam期望这样:

The type T of the annotated parameter,field or property must either:

– Be a primitive type

– Have a constructor that accepts a single String argument

– Have a static method named valueOf that accepts a single String argument (see,for example,Integer.valueOf(String))

– Be List,Set or SortedSet,where T satisfies 2 or 3 above. The resulting collection is read-only.

这同样适用于@DefaultValue.您必须指定@DefaultValue(“BIG_BIRD”),@ DefaultValue(“SMALL_CAT”)或@DefaultValue(“MEDIUM_DOG”):

@POST
@Path("/zoo")
public Response createNewAnimal(
        @QueryParam("animal") 
        @DefaultValue("SMALL_CAT") AnimalType type) {
    // ...
    return Response.ok().entity(type.toString()).build();
}

如果您不希望将java类型的名称公开给客户端,则可以将正确的查询字符串值转换为枚举实例. if … else …如果是一种非常简单的方法来实现这一目标,但如果你想要更高档的东西,你可以创建一个这样的包装器:

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class AnimalTypeWrapper {
    private static final Map<String,AnimalType> MAPPER = Collections
            .unmodifiableMap(new HashMap<String,AnimalType>() {
                {
                    put("bird",AnimalType.BIG_BIRD);
                    put("dog",AnimalType.MEDIUM_DOG);
                    put("cat",AnimalType.SMALL_CAT);
                }
            });

    private AnimalType type;

    public static AnimalTypeWrapper valueOf(String value) {
        AnimalType type = AnimalTypeWrapper.MAPPER.get(value.toLowerCase());
        if (type == null) {
            // if nothing found just set the desired default value
            type = AnimalType.SMALL_CAT;
        }
        return new AnimalTypeWrapper(type);
    }

    private AnimalTypeWrapper(AnimalType type) {
        this.type = type;
    }

    public AnimalType getType() {
        return this.type;
    }
}

并在您的资源方法中有:

@POST
@Path("/zoo")
public Response createNewAnimal(
        @QueryParam("animal") 
        AnimalTypeWrapper typeWrapper) {
    // ...
    AnimalType type = typeWrapper.getType();
    return Response.ok().entity(type.toString()).build();
}

如何使用基于JAX-RS的Restlet自动将@DefaultValue映射到枚举参数?的更多相关文章

  1. 泛型 – Xcode构建错误时,我添加枚举到泛型类?

    为什么在将泛型类添加到枚举时会收到错误:错误:但是当我这样做时,我没有收到错误:或这个:解决方法您不能将任何类型嵌套在通用的类型中,反之亦然.换句话说,你不能像类,结构和枚举这样做的事情:和乃至苹果人explained的限制原因:It’sanimplementationlimitation.We’llremovetherestrictiononceourcompilerandruntimearea

  2. 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 10 Enumerations

    Swift中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果一个值被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或是一个整型值或浮点值//2.EnumerationSyntax//_______________________________________________________________________________________________//使用enum关键字创建枚举enumCompasspoint{//枚举名一般大写,与C不同,Swift中枚举不会默认元素赋值

  3. Swift语法基础:5 - Swift的枚举和结构体

    在Siwft中的枚举类型以及结构体,是和OC中差不多的,但Swift中又有一些特性,下面让我们来看看:1.枚举的声明及使用PS:这里解释一下,枚举类型第一个开始的参数都是1,无论你是有多少case,都会递增的,比如例子的的Ace是1,那么Two就是名副其实的2,Three就是3,以此类推,一直到King,就是13,而enum里面有一个方法,这里面这个方法只是说可以在enum里定义方法,但我这个例子

  4. Swift面向对象的类型

    1、类2、结构体3、枚举在swift语言中通过类和结构体实现面向对象,在Swift语言中,枚举也具有面向对象的特性示例和对象在面向对象中,将类创建对象的过程称为实例化,因此将对象称为实例化,但是在swift中,枚举和结构体不能称为对象,因为结构体和枚举并不是彻底的面向对象类型,而是只包含了一些面向对象的特定,例如,在Swift中继承只发生在类上,结构体和枚举不能继承

  5. Swift基础语法: 24 - Swift的枚举语法, 匹配枚举值和 Switch 语句, 关联值, 原始值

    在前面,我们把函数和闭包解决完毕了,现在让我们来看看Swift中的枚举和Switch:1.枚举语法所谓的枚举其实就是定义一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。

  6. swift与枚举

    每个原始值在它的枚举声明中必须是唯一的。andequalsPlanet.Uranus//GCD演示//高效循环实现原理:将循环的每次迭代提交到dispatchqueue进行处理,结合并发queue使用时,可以并发地执行迭代以提高性能。但是也不是任何一个循环都需要用dispatch_apply来替换,因为dispatchqueue还是存在一些开销的,虽然非常小。所以只有当你的循环代码拥有足够的工作量,才能忽略掉dispatchqueue的这些开销以提高性能。

  7. Swift 2

    letlabel="Thewidthis"letwidth=94letwidthLabel=label+String练习:删除最后一行中的String,错误提示是什么?你可以一起使用if和let来处理值缺失的情况。switch支持任意类型的数据以及各种比较操作——不仅仅是整数以及测试相等。运行switch中匹配到的子句之后,程序会退出switch语句,并不会继续向下运行,所以不需要在每个子句结尾写break。

  8. swift之方法

    结构体和枚举能够定义方法是Swift与C/Objective-C的主要区别之一。Swift中的方法和Objective-C中的方法极其相似。和函数参数不同,对于方法的参数,Swift使用不同的默认处理方式,这可以让方法命名规范更容易写。具体来说,Swift默认仅给方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称局部参数名称和外部参数名称。

  9. swift语言学习-10.枚举

    里面的成员用case申明,有点像switch。像Swift中其他类型一样,它们的名字必须以一个大写字母开头。每个原始值在它的枚举声明中必须是唯一的。当整型值被用于原始值,如果其他枚举成员没有值时,它们会自动递增。我们用上面的switch来匹配下是不是等于UranusletpositionToFind9ifsomePlanet"Mostlyharmless"}}else"Thereisn'taplanetatposition\"//输出"Thereisn'taplanetatposition9这个范例使用可

  10. [连载]Swift开发入门05--- 枚举

    在switch多分支结构中使用枚举我们可以使用switch多分支结构来处理枚举类型的值,如下所示:Swift中的switch语句要求必须覆盖所有的可能,如果你如下书写上面这段代码,就会产生一个编译错误:“switchmustbeexhaustive,consideraddingadefaultclause.”。当然也可以在一个case中书写多种可能性,这一点也是Swift对switch结构的改进,不同于Java、C#、JavaScript这样的语言,完整的代码如下所示:枚举类型在Swift中,枚举在某些程

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部