ProgramingTip

WADL 문제 / 계약 우선 접근 방식으로 Jersey를 사용하여 XSD 생성

bestdevel 2021. 1. 8. 23:05
반응형

WADL 문제 / 계약 우선 접근 방식으로 Jersey를 사용하여 XSD 생성


저는 며칠 동안 Jersey를 사용하여 REST 웹 서비스에서 작업 해 왔으며 XML, JSON, Google Protobuf와 같은 여러 교환 형식으로 모든 CRUD 작업이 작동하도록 관리했습니다.

그러나 자동 생성 된 WADL 및 XSD와 관련된 몇 가지 문제가 있습니다.


석고

이 세 가지 형식으로 교환되는 객체를 정의하기 위해 "계약 우선"접근 방식을 따랐습니다 .

  • 내가 XSD에서 JAXB를 사용하여 모델 클래스를 생성했습니다.
  • 필자가 동등한 proto 파일에서 Google Protobuf 클래스를 생성했습니다 (내부적으로 하나의 고유 한 모델을 갖기 위해이를 JAXB 생성로 변환하는 방법이 있습니다).

그러나 사용자가 자신의 클래스생성 할 수 있기 때문에 바라기 때문에 스키마 파일 (.xsd 및 .proto)을 공유 하고 자동 생성 된 WADL과 잘 통합하고 싶습니다 .

이를 위해 위키 페이지 덕분에 :

  • 아래에 두 파일을 노출했습니다.
    • /schema/schema.xsd
    • /schema/schema.proto
  • 응용 프로그램 문법 파일을 추가했습니다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <grammars xmlns="http://wadl.dev.java.net/2009/02" 
              xmlns:xsd="http://www.w3.org/2001/XMLSchema"
              xmlns:xi="http://www.w3.org/1999/XML/xinclude">
        <include href="../schema/schema.xsd" />
    </grammars>
    
  • WADL 생성기를 추가했습니다.

     public class RichWadlGeneratorConfig extends WadlGeneratorConfig {
        @Override
        public List<WadlGeneratorDescription> configure() {
            return generator(WadlGeneratorApplicationDoc.class)
                .prop("applicationDocsStream", "application-doc.xml")
                .generator(WadlGeneratorGrammarsSupport.class)
                .prop("grammarsStream", "application-grammars.xml")
                .descriptions();
        }
     }
    

이렇게하면 WADL에 다음과 같이 표시 /rest/application.wadl됩니다.

<grammars>
     <include href="../schema/schema.xsd"/>
     <include href="application.wadl/xsd0.xsd">
          <doc title="Generated" xml:lang="en"/>
     </include>
</grammars>

문제

/rest/application.wadl/xsd0.xsd자동으로 내 수업에서 발생하지만, 아주이다 다른 내가 처음에 한 무슨에서 schema.xsd. 또한 wadl2java이 WADL 과 같은 도구를 호출하는 것은 비참하게 실패합니다.

  • /schema/schema.xsd, 및
  • /rest/application.wadl/xsd0.xsd

이제 충돌합니다 (동일한 개체에 대한 두 가지 정의).


질문

  1. 이 자동 생성 XSD의 생성 및 확산을 비활성화하는 방법이 있습니까? (이 "계약 우선"접근 방식을 따르기 때문에 필요하지 않기 때문에)

  2. 그렇지 않은 경우, /rest/application.wadl/xsd0.xsd히트 시 수동으로 작성한 XSD로 컨텐츠를 "재정의"하는 방법 이 있습니까? (사용자 지정 WADL을 생성하기 위해 WadlResource에 대해 검색했지만 XSD 생성 자체에 대해서는 아무것도 찾지 못했습니다)


도움에 미리 감사드립니다!

미디엄.


편집하다

1) Jersey 팀에 문제를 제기하고 답장을 받았습니다. http://java.net/projects/jersey/lists/users/archive/2012-06/message/8

2) Pavel의 지시에 따라 티켓 (JERSEY-1230)을 제기했습니다. 현재 직접 수정 사항을 제출하거나 Jersey 팀으로부터 수정 사항을 받기 위해 후속 조치를 취하고 있습니다.


1.14-SNAPSHOT 을 사용하면 다음을 수행 할 수 있습니다.

public class SampleWadlGeneratorConfig extends WadlGeneratorConfig {

    @Override
    public List<WadlGeneratorDescription> configure() {
        return generator( WadlGeneratorApplicationDoc.class )
                .prop( "applicationDocsStream", "application-doc.xml" )
                .generator( WadlGeneratorGrammarsSupport.class )
                .prop( "grammarsStream", "application-grammars.xml" )
                .prop("overrideGrammars", true)                               // !!!
                .generator( WadlGeneratorResourceDocSupport.class )
                .prop( "resourceDocStream", "resourcedoc.xml" )
                .descriptions();
    }

}

overrideGrammars가 true로 설정되면 Jersey에서 생성 한 문법이 반환 된 WADL에 포함되지 않습니다.

참조 URL : https://stackoverflow.com/questions/10870583/troubles-with-wadl-generated-xsd-using-jersey-with-a-contract-first-approach

반응형