我有一个用例,我需要限制可以作为查询参数传递的值。
\n\n@Path("/foo")\npublic interface Foo {\n\n @GET\n @Path("/details/id/{id}")\n void getFooDetails(@PathParam("id") String id, @QueryParam("sort") String sortDirection);\n}\n\npublic class FooImpl {\n public void getFooDetails(String id, String sortDir) {\n //Implementation\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n在上面的示例中,我想限制sort可以通过 API 传递到ASC, DESC.
是否有任何现有的 CXF 注释可以用来限制参数的值?我还没有找到任何解决方案,所以我尝试了以下解决方案。
\n\n我的方法:
\n\n@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})\n@Retention(RetentionPolicy.RUNTIME)\n@Inherited\npublic @interface ValueSet {\n\n String[] allowedValues();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n修改后的界面如下所示。
\n\n@Path("/foo")\npublic interface Foo {\n\n @GET\n @PathParam("/details/id/{id}")\n void getFooDetails(@PathParam("id") String id, @QueryParam("sort") @ValueSet(allowedValues = {"ASC", "DESC"}) String sortDirection);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我编写了一个 CXF 拦截器来拦截 API 调用。我使用反射来处理参数FooImpl.getFooDetails。但我面临的问题是,拦截器查看 FooImpl.getFooDetails …
我编写了 Rest API,当后端系统中有数据时,它返回 200 http 代码。但是,当后端系统中没有数据时,我应该返回哪个 http 状态代码,这样它将帮助客户端代码毫无歧义地解释响应。
我正在 Kotlin 中工作,想要读取实体列表,但在 {} 上遇到语法错误:“类型不匹配,必需:类型!,找到:() -> 单位”
如果我删除 {},则 GenericType 上出现语法错误:“无法访问 'init',它在 GenericType 中受保护”
我想知道从 Kotlin 的响应中读取实体列表的正确语法是什么
val path = URL_PATH
val target = getTarget(path)
val response = getRequestBuilder(target).get()
response.readEntity(GenericType<List<FoodSummary>>() {})
Run Code Online (Sandbox Code Playgroud) 无法在令牌标头中设置 JWT 令牌类型。
这是为了制作我已经在 JAX-RS 中开发的安全 API。基本上,我通过 Jwts.builder() 方法生成了一个令牌,作为回报,我在 APPLICATION_JSON 中获取了令牌,然后我将此令牌粘贴到https://jwt.io/Debugger。所以我知道没有指定令牌类型的令牌标头,只有 { "alg": "HS512" } 也许这可能是我无法访问安全 API 的原因。当我尝试访问安全 API 时,出现“不支持签名声明 JWS”异常。
认证服务.java
private String issueToken(String login, String password) {
LocalDateTime now = LocalDateTime.now().plusMinutes(10L);
Instant instant = now.atZone(ZoneId.systemDefault()).toInstant();
Date jwtExpiry = Date.from(instant);
String jwtToken = Jwts.builder().setSubject(login).setIssuer("XYZ").setIssuedAt(new Date())
.setExpiration(jwtExpiry).signWith(SignatureAlgorithm.HS512, "secretKey").compact();
return jwtToken;
}
public class JWTTokenNeededFilter implements ContainerRequestFilter
{
public static final Logger logger = Logger.getLogger(JWTTokenNeededFilter.class);
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
String token = requestContext.getHeaderString("userToken");
if (token …Run Code Online (Sandbox Code Playgroud) 我有 JAX-RS Web 应用程序,我想记录从获取请求到响应的时间量。在 Spring Boot 中使用 servlet 过滤器很容易。但我的应用程序中的过滤器无法正常工作:
@Provider
public class RequestLogFilter implements ContainerRequestFilter, ContainerResponseFilter {
private long requestStartTime;
@Override
public void filter(ContainerRequestContext requestContext) {
requestStartTime = System.currentTimeMillis();
}
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) {
long requestFinishTime = System.currentTimeMillis();
System.out.println(requestFinishTime - requestStartTime);
}
}
Run Code Online (Sandbox Code Playgroud)
它在第一种方法中工作正常,其中当前时间戳写入requestStartTime. 但是,似乎第二种方法有自己的requestStartTime变量副本,因为它是第二种方法,它始终等于零。所以我无法计算变量之间的差异。我可以做什么来记录请求处理时间?
我有一个 Quarkus 应用程序,在其中实现了ContainerRequestFilter用于保存传入请求的标头的接口:
@PreMatching
public class SecurityFilter implements ContainerRequestFilter {
private static final String HEADER_EMAIL = "HD-Email";
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
String email = requestContext.getHeaders().getFirst(HEADER_EMAIL);
if (email == null) {
throw new AuthenticationFailedException("Email header is required");
}
requestContext.setSecurityContext(new SecurityContext() {
@Override
public Principal getUserPrincipal() {
return () -> email;
}
@Override
public boolean isUserInRole(String role) {
return false;
}
@Override
public boolean isSecure() {
return false;
}
@Override
public String getAuthenticationScheme() {
return null; …Run Code Online (Sandbox Code Playgroud) 我将使用weblogic和JAX-RS构建许多Web服务.为了简单起见,我将把每个服务放在自己的项目中.但我似乎遇到的问题是为每个项目设置context-root.
可以在save weblogic服务器上部署的多个项目是否具有相同的上下文根?
Java EE REST指定JAX-RS描述了路径变量到正则表达式的转换,例如/customer/{id}.
从JAX-RS 1.1规范,第19页:
将每个URI模板变量替换为包含指定正则表达式的捕获组,如果未指定正则表达式,则替换为"([/] +?)".
java.util.regex.Pattern的Java API doc说:
X? X, once or not at all
X+ X, one or more times
Run Code Online (Sandbox Code Playgroud)
那么,意味着+?什么?
我想为我的RESTful Web服务提供灵活的身份验证方法 - 通过HTML表单或XML.我意识到我可以从HTML表单进行AJAX调用,但我认为一个更简单的机制会很有用(特别是在开发过程中).
如果我用@Consumes("application/xml","application/x-www-form-urlencoded")注释我的SessionResource.createSession()方法,它将接受这两种类型的内容.困难的部分是区分XML流和HTML.
任何指导或想法将不胜感激.