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

Java:枚举不区分大小写的泽西查询参数绑定

向苗宣
2023-03-14

我试图重写/实现JSR311中的所有属性,但Jersey绑定似乎区分大小写:

  1. 做一个原始类型
  2. 有一个接受单个String参数的构造函数
  3. 有一个静态方法命名为value eOf或from mString,它接受单个String参数(例如,参见Integer.valueOf(String))
  4. 是List、Set或sortedSet,其中T满足上面的2或3。生成的集合是只读的。

如何使枚举的泽西绑定不区分大小写?

编辑:

这是代码:

枚举:

public enum Color {

    GREEN,

    BLUE;

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

Bean参数:

 public class FooQueryParam {
        @QueryParam(value = "color")
        private Color color;

        public Color getColor() {
            return color;
        }

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

资源:

public Response get(@BeanParam FooQueryParam fooQueryParam) {
            //... 
}

共有1个答案

施自珍
2023-03-14

如果你做得对,这应该不是问题。例如,在案例3中,使用fromString

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);
        }
    }
}

每个枚举都已经有一个静态value eOf方法,它试图完全匹配枚举值,因此我们通过定义from mString来覆盖此行为。我们首先调用toUpperCase(),然后调用value eOf,因为它正在查找大写字母。如果有任何失败,比如错误的枚举值,我们发送一个400。您可以发送其他东西或坚持使用正常的404。由您决定。

我已经这样做了,它不起作用

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

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();
    }
}

使用此依赖项

<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进行测试

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。其他情况下的敏感性问题都很好

 类似资料:
  • 问题内容: 如果我像这样在Spring控制器中有一个RequestMapping … 产品是一个枚举。例如。产品首页 当我请求页面时,mysite.com / home 我懂了 有没有办法让枚举类型转换器理解小写的home实际上是Home? 我想保持url大小写不敏感,并且我的Java枚举使用标准大写字母。 谢谢 解 注册 添加到需要特殊转换的控制器 问题答案: 概括地说,您想创建一个新的Prop

  • 问题内容: 如何反序列化包含不区分大小写的枚举值的JSON字符串?(使用Jackson Databind) JSON字符串: 和我的Java POJO: 在这种情况下,使用JSON反序列化将在可行的地方失败。但出于命名约定的原因,我也想工作。 序列化POJO也会导致大写 我想到了使用@JsonGetter: 而且有效。但是我想知道是否有更好的解决方案,因为这对我来说似乎是hack。 我也可以编写一

  • 我正在构建一个Spring Boot REST API。它有一个POST请求,用于将大型对象保存到Mongo数据库。我试图使用枚举来控制数据存储方式的一致性。例如,这是我对象的一部分: 我的问题:当我传入一个不是我的枚举的大写版本的值(例如“mobile”或“Mobile”)时,我得到以下错误: 我觉得应该有一种相对简单的方法来获取传递到API中的内容,将其转换为大写字母,将其与枚举进行比较,如果

  • 枚举 场域 Application.Properties(小写)

  • 我的目标是所有下面的URI都应该工作 https://rest/xyz?sort=name https://rest/xyz?排序=名称 https://rest/xyz?过滤器=名称=值 https://rest/xyz?Filter=name=value 为了实现这一点,我创建了自定义过滤器,该过滤器覆盖了传递给过滤器链的HttpServlet请求。以下是此方法的链接: http://foru

  • 问题内容: 我正在使用Flask-SQLAlchemy从用户数据库中查询;但是,虽然 will return doing returns 我想知道是否有一种以不区分大小写的方式查询数据库的方法,以便第二个示例仍然返回 问题答案: 你可以使用过滤器中的或功能来完成此操作: 另一种选择是使用而不是进行搜索: