Validarea schemelor pe server cu JAX-WS (Programare, Validare, Xsd, Jax Ws, Personalizare Jax Ws)

fără id a intrebat.

Am un serviciu fără container JAX-WS (publicat prin Endpoint.publish() direct din main() metoda). Vreau ca serviciul meu să valideze mesajele de intrare. Am încercat următoarea adnotare: @SchemaValidation(handler=MyErrorHandler.class) și am implementat o clasă corespunzătoare. Când pornesc serviciul, obțin următorul lucru:

Exception in thread "main" javax.xml.ws.WebServiceException: 
Annotation @com.sun.xml.internal.ws.developer.SchemaValidation(outbound=true,
inbound=true, handler=class mypackage.MyErrorHandler) is not recognizable, 
atleast one constructor of class 
com.sun.xml.internal.ws.developer.SchemaValidationFeature 
should be marked with @FeatureConstructor

Am găsit câteva soluții pe internet, dar toate implică utilizarea containerului WebLogic. În cazul meu nu pot folosi containerul, am nevoie de un serviciu încorporat. Pot totuși să folosesc validarea schemei?

2 răspunsuri
joergl

@SchemaValidation nu este definită în specificațiile JAX-WS, dar validarea este lăsată deschisă. Acest lucru înseamnă că aveți nevoie de ceva mai mult decât doar clasele din jdk.

Atâta timp cât sunteți capabil să adăugați niște jars la classpath, puteți configura acest lucru destul de ușor folosind metro (care este inclus și în WebLogic. Acesta este motivul pentru care găsiți soluții care folosesc WebLogic ca și container). Pentru a fi mai precis, trebuie să adăugați două borcane la classpath. V-aș sugera să

  1. să descărcați cea mai recentă versiune metro.
  2. Descompuneți-o undeva.
  3. Adăugați jaxb-api.jar și jaxws-api.jar la classpath. Puteți face acest lucru, de exemplu, punându-le în fișierul JAVA_HOME/lib/endorsed sau adăugându-le manual în proiect. Acest lucru depinde în mare măsură de IDE sau de ceea ce folosiți.

Odată ce ați făcut acest lucru, aplicația MyErrorHandler ar trebui să funcționeze chiar dacă este implementat prin Endpoint.publish(). Cel puțin eu am această configurație la nivel local și se compilează și funcționează.

Dacă nu puteți modifica classpath-ul și aveți nevoie de validare, va trebui să validați manual cererea folosind JAXB.

Comentarii

  • Probabil că vă referiți la jaxws-rt.jar. Oricum, tocmai am pus toate JAR-urile (cu excepția celor JavaDoc) în classpath-ul proiectului, iar acum gestionarul meu de validare funcționează bine. Vă mulțumesc! –  > Por fără id.
  • Hm, am încercat să verific asta, dar din anumite motive nu pot face ca handlerul să nu funcționeze, deși am eliminat toate dependențele de aceste jars și le-am eliminat și din JAVA_HOME/lib/endorsed. Trebuie să fie în cache undeva unde nu pot găsi acum… Va încerca din nou când la o altă mașină. Oricum, mă bucur că este o soluție pentru tine 🙂 –  > Por joergl.
Evandro Pomatti

Întrebare veche, dar am rezolvat problema folosind pachetul corect și configurația minimă, precum și folosind doar serviciile furnizate de WebLogic. Mă loveam de aceeași problemă ca și tine.

Doar asigurați-vă că folosiți tipul corect de java așa cum am descris aici.

Deoarece plănuiesc să mă extind la un mecanism de urmărire, am implementat și gestionarul de erori personalizat.

Serviciu web cu gestionarul de validare personalizat

import com.sun.xml.ws.developer.SchemaValidation;

@Stateless
@WebService(portName="ValidatedService")
@SchemaValidation(handler=MyValidator.class)
public class ValidatedService {

    public ValidatedResponse operation(@WebParam(name = "ValidatedRequest") ValidatedRequest request) {

        /* do business logic */

        return response;
    }
}

Manipulator personalizat pentru înregistrarea și stocarea erorilor în baza de date

public class MyValidator extends ValidationErrorHandler{

    private static java.util.logging.Logger log = LoggingHelper.getServerLogger();

    @Override
    public void warning(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void error(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    @Override
    public void fatalError(SAXParseException exception) throws SAXException {
        handleException(exception);
    }

    private void handleException(SAXParseException e) throws SAXException {
        log.log(Level.SEVERE, "Validation error", e);
        // Record in database for tracking etc
        throw e;
    }
}