我试图重写/实现JSR311中的所有属性,但Jersey绑定似乎区分大小写:
如何使枚举的泽西绑定不区分大小写?
编辑:
这是代码:
枚举:
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) {
//...
}
如果你做得对,这应该不是问题。例如,在案例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 我想知道是否有一种以不区分大小写的方式查询数据库的方法,以便第二个示例仍然返回 问题答案: 你可以使用过滤器中的或功能来完成此操作: 另一种选择是使用而不是进行搜索: