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

如何禁止使用jaxb和jaxrs在实体属性中使用斜杠'/'

皇甫乐
2023-03-14

我拥有以下实体:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = EntityConstants.PARTNER)
public class FilePartner
{
    @XmlAttribute(name = EntityConstants.IDENTIFIER, required = true)
    @XmlJavaTypeAdapter(RestResourceIdJaxbAdapter.class)
    private String identifier;
    ...
}

以下是jaxb适配器:

public class RestResourceIdJaxbAdapter extends XmlAdapter<String, String>
{
    @Override
    public String unmarshal(String v) throws Exception
    {
        if (v != null && v.contains("/"))
        {
            // throw new ApiException(Status.BAD_REQUEST, RestErrorMessages.BAD_REQUEST_SUFFIX, "Identifier must not contain slashes");

            return v.replaceAll("/", "");
        }

        return v;
    }

    @Override
    public String marshal(String v) throws Exception
    {
        return v;
    }
}

我有一个jaxrs服务,它接受体FilePartners的POST请求:

@POST
    @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
    public Response createPartner(FilePartner partner,
                                  @Context UriInfo uriInfo,
                                  @HeaderParam(HttpHeaders.ACCEPT) String acceptHeader)
        throws ApiException
    {
        ...
    }

我想要实现的是禁止在FilePartners实体的标识符属性中使用斜杠'/'。今天,我使用一些jaxb适配器来做这件事,它在解组时简单地从id中剥离所有斜杠。相反,我想要的是返回一个适当的BAD_REQUEST异常给用户。

我尝试在jaxb适配器的unmarshal方法中抛出异常,但似乎jaxrs正在吞并它,只是将标识符设置为null。如果我们想要覆盖这个行为,我想我必须创建一个新的@Provider,并在javax所使用的解组器中注册一个特殊的ValidationEventHandler。ws。rs.ext。MessageBodyReader创建。不幸的是,除非我定义了对JAX-RS实现的显式依赖,否则这是不可能的,我希望避免这种依赖。

是否有其他选项限制标识符属性中斜杠的使用,而不定义对jersey/resteasy的显式依赖关系,也不处理服务@POST方法中的限制?

共有1个答案

李振国
2023-03-14

拯救您的是ReaderInterceptor

不要使用@XmlJavaTypeAdapter进行任何特殊处理。注册一个ReaderInterceptor与您的Application类(如果在jersey2中)或web.xml如果更早。

import java.io.IOException;

import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
javax.ws.rs.ext.ReaderInterceptor

@Provider
public class ValidationInterceptor implements ReaderInterceptor {
    public ValidationInterceptor() {
        super();
    }

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext readerInterceptorContext) throws IOException,
                                                                                           WebApplicationException {
        Object o = readerInterceptorContext.proceed();
        if (o instanceof FilePartner&& ((FilePartner) o).getIndentifier().contains("/")) {
            throw new WebApplicationException(Response.status(400)
                                                      .entity("Identifier must not contain a slash")
                                                      .build());

        }
        return o;
    }
}

并将拦截器注册到公共集覆盖中的应用程序中

希望这有所帮助。

 类似资料:
  • 这是我的xml: 我为这个xml使用了JAXB和unMarshall,我可以得到描述和外部密钥。但是我不能得到有价值的属性名称。 > 这是我的java类: 组织JAVA 银行JAVA 如何获取属性名称和值?谢谢你

  • 问题内容: 我必须首先禁用输入,然后单击链接以启用它们。 到目前为止,这是我尝试过的方法,但是没有用。 HTML: jQuery的: 这显示给我,然后输入没有任何变化: 问题答案: ** 使用jQuery时,请始终使用该方法来启用或禁用元素(有关原因,请参见下文)。 在您的情况下,它将是: 为什么在可以使用/ 做到这一点时使用? 基本上,应该获取或设置时,可使用特性(如,,和在其他之中)。 通过使

  • 我必须先禁用输入,然后单击链接以启用它们。 这是我迄今为止尝试过的,但它不起作用。 HTML: jQuery: 这会显示“真”,然后显示“假”,但输入没有变化:

  • 我有一个来自REST API的XML响应,如下所示: 我知道如何使用jaxb获取xml元素值,即“XYZ”,并绑定到bean。但我被困在知道如何获取资源的价值(即https://www.cyz.com),单位(“PH”),href(“ww.com”),div?内xmlns的值,然后将该值映射到对象属性。请帮助我。

  • JSP在2.0以前不支持EL表达式,因此,在这些老版本的JSP页面中,如果包含了“${...}”格式的信息,将会被当作普通的字符串来处理。如果这些老版本的JSP页面被移植到支持新版JSP标准(2.0及以上版本)的JSP引擎上,系统就会将“${...}”格式的信息当成EL表达式来处理。这就可能会使同一个JSP页面中不同版本的JSP引擎中运行结果不一致。 为了使JSP引擎向下兼容,在page指令中提供