首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java: Enum不区分大小写的泽西查询Param绑定

Java: Enum不区分大小写的泽西查询Param绑定
EN

Stack Overflow用户
提问于 2015-10-26 23:50:07
回答 1查看 8.1K关注 0票数 10

我试图覆盖/实现JSR311中的所有属性,但泽西绑定似乎是大小写敏感的。

  1. 是原语类型
  2. 有一个接受单个字符串参数的构造函数。
  3. 具有一个名为valueOf或fromString的静态方法,该方法接受单个字符串参数(例如,请参见Integer.valueOf( String ))
  4. 是列表,集合或SortedSet,其中T满足2或3以上。结果集合是只读的。

我如何使泽西岛绑定的枚举大小写不敏感?

编辑:

下面是代码:

枚举:

代码语言:javascript
复制
public enum Color {

    GREEN,

    BLUE;

    public Color fromString(String param) {
        String toUpper = param.toUpperCase();
        try {
            return valueOf(toUpper);
        } catch (Exception e) {
            return null;
        }
    }
}

豆瓣:

代码语言:javascript
复制
 public class FooQueryParam {
        @QueryParam(value = "color")
        private Color color;

        public Color getColor() {
            return color;
        }

        public void setStatus(Color Color) {
            this.color = color;
        }
    }

资源:

代码语言:javascript
复制
public Response get(@BeanParam FooQueryParam fooQueryParam) {
            //... 
}
EN

回答 1

Stack Overflow用户

发布于 2015-10-27 00:35:53

如果你做得对,那就没问题了。例如,在案例3中,使用fromString

代码语言:javascript
复制
public static enum Color {

    RED, GREEN, BLUE;

    public static Color fromString(String param) {
        String toUpper = param.toUpperCase();
        try {
            return valueOf(toUpper);
        } catch (Exception e) {
            // default behavior is to send 404 on error.
            // do something else if you want
            throw new WebApplicationException(400);
        }
    }
}

每个枚举都有一个静态的valueOf方法,它试图精确地匹配枚举值,因此我们通过定义fromString来覆盖这个行为。我们首先调用toUpperCase(),然后调用valueOf,因为它正在查找大小写。如果有什么失败,比如一个错误的枚举值,我们发送一个400。您可以发送其他东西或坚持正常404。你说了算。

我已经做过了,这不管用

这里是一个完整的测试用例。

代码语言:javascript
复制
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class EnumTest extends JerseyTest {

    public static enum Color {

        RED, GREEN, BLUE;

        public static Color fromString(String param) {
            String toUpper = param.toUpperCase();
            try {
                return valueOf(toUpper);
            } catch (Exception e) {
                // default behavior is to send 404 on error.
                // do something else if you want
                throw new WebApplicationException(400);
            }
        }
    }
    
    @Path("enum")
    public static class ColorResource {
        
        @GET
        public String color(@QueryParam("color") Color color) {
            return color.toString();
        }
    }
    
    @Override
    public ResourceConfig configure() {
        return new ResourceConfig(ColorResource.class);
    }
    
    @Test
    public void doit() {
        Response response = target("enum").queryParam("color", "blue").request().get();
        assertEquals(200, response.getStatus());
        assertEquals("BLUE", response.readEntity(String.class));
        response.close();
        
        response = target("enum").queryParam("color", "gReEn").request().get();
        assertEquals(200, response.getStatus());
        assertEquals("GREEN", response.readEntity(String.class));
        response.close();

        response = target("enum").queryParam("color", "RED").request().get();
        assertEquals(200, response.getStatus());
        assertEquals("RED", response.readEntity(String.class));
        response.close();
        
        response = target("enum").queryParam("color", "orange").request().get();
        assertEquals(400, response.getStatus());
        response.close();
    }
}

使用此依赖项

代码语言:javascript
复制
<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>2.19</version>
    <scope>test</scope>
</dependency>

更新

使用@BeanParam进行测试

代码语言:javascript
复制
import javax.ws.rs.BeanParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class EnumTest extends JerseyTest {

    public static enum Color {

        RED, GREEN, BLUE;

        public static Color fromString(String param) {
            String toUpper = param.toUpperCase();
            System.out.println("--- toUpper " + toUpper + "---");
            try {
                return valueOf(toUpper);
            } catch (Exception e) {
                System.out.println(" --- ERROR ---");
                // default behavior is to send 404 on error.
                // do something else if you want
                throw new WebApplicationException(400);
            }
        }
    }
    
    public static class FooQueryParam  {
        @QueryParam("color") 
        private Color color;
        public Color getColor() { return color; }
        public void setColor(Color color) { this.color = color; }
    }
    
    @Path("enum")
    public static class ColorResource {
        
        @GET
        public String color(@BeanParam FooQueryParam foo) {
            return foo.getColor().toString();
        }
    }
    
    @Override
    public ResourceConfig configure() {
        return new ResourceConfig(ColorResource.class);
    }
    
    @Test
    public void doit() {
        Response response = target("enum").queryParam("color", "blue").request().get();
        assertEquals(200, response.getStatus());
        assertEquals("BLUE", response.readEntity(String.class));
        response.close();
        
        response = target("enum").queryParam("color", "gReEn").request().get();
        assertEquals(200, response.getStatus());
        assertEquals("GREEN", response.readEntity(String.class));
        response.close();
        
        response = target("enum").queryParam("color", "RED").request().get();
        assertEquals(200, response.getStatus());
        assertEquals("RED", response.readEntity(String.class));
        response.close();
        
        response = target("enum").queryParam("color", "orange").request().get();
        assertEquals(400, response.getStatus());
        response.close();
    }
}

唯一失败的是错误的情况,我发送一个坏的颜色。似乎@BeanParam的行为是不同的。而不是预期的400,有500。另一种情况-感情问题很好

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33357594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档