Fra*_*ank 5 java jaxb xml-serialization resteasy jboss7.x
我正在尝试验证在JBoss AS 7中运行的应用程序中通过我的(合同优先)REST接口传来的所有传入XML文件.我编写了一个用于Pretty-Printing的@Decorator(如JBoss RESTeasy文档中的示例)和一个类似的用于为unmarshaller打开XML模式验证.不幸的是,unmarshaller的装饰器从未被调用过.
以下是Pretty Decorator的代码:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.xml.bind.Marshaller;
import org.jboss.resteasy.annotations.Decorator;
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Decorator(processor = PrettyProcessor.class, target = Marshaller.class)
public @interface Pretty {}
Run Code Online (Sandbox Code Playgroud)
并实施:
import java.lang.annotation.Annotation;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.Marshaller;
import javax.xml.bind.PropertyException;
import org.apache.log4j.Logger;
import org.jboss.resteasy.annotations.DecorateTypes;
import org.jboss.resteasy.spi.interception.DecoratorProcessor;
@DecorateTypes({ "text/*+xml", "application/*+xml", MediaType.APPLICATION_XML, MediaType.TEXT_XML })
public class PrettyProcessor implements DecoratorProcessor<Marshaller, Pretty> {
private static final Logger LOGGER = Logger.getLogger(PrettyProcessor.class);
@Override
public Marshaller decorate(Marshaller target, Pretty annotation, Class type, Annotation[] annotations, MediaType mediaType) {
LOGGER.debug("Pretty.");
try {
target.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
} catch (PropertyException e) {
}
return target;
}
}
Run Code Online (Sandbox Code Playgroud)
现在验证的注释(不起作用):
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.xml.bind.Unmarshaller;
import org.jboss.resteasy.annotations.Decorator;
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Decorator(processor = ValidateProcessor.class, target = Unmarshaller.class)
public @interface Validate {}
Run Code Online (Sandbox Code Playgroud)
实施:
import java.lang.annotation.Annotation;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.Provider;
import javax.xml.XMLConstants;
import javax.xml.bind.Marshaller;
import javax.xml.bind.PropertyException;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.apache.log4j.Logger;
import org.jboss.resteasy.annotations.DecorateTypes;
import org.jboss.resteasy.spi.interception.DecoratorProcessor;
import org.xml.sax.SAXException;
@DecorateTypes({ "text/*+xml", "application/*+xml", MediaType.APPLICATION_XML, MediaType.TEXT_XML })
public class ValidateProcessor implements DecoratorProcessor<Unmarshaller, Validate> {
private static final Logger LOGGER = Logger.getLogger(ValidateProcessor.class);
@Override
public Unmarshaller decorate(Unmarshaller target, Validate annotation, Class type, Annotation[] annotations, MediaType mediaType) {
target.setSchema(getSchema());
LOGGER.debug("Set validation schema.");
System.out.println("Set validation schema.");
return target;
}
}
Run Code Online (Sandbox Code Playgroud)
以及REST接口的代码:
import javax.annotation.security.RolesAllowed;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
import javax.xml.ws.WebServiceException;
@Path("/{mdvt}/{ouid}/order")
public interface OrderResource {
@RolesAllowed({ "mpa" })
@POST
@Path("/update")
@Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_XML})
@Produces(MediaType.APPLICATION_XML)
@Pretty
public Response update(@Context SecurityContext sec,
@PathParam("ouid") String ouID,
@PathParam("mdvt") long masterDataVersionTag,
@Validate UpdateOrdersRequest uor) throws WebServiceException;
}
Run Code Online (Sandbox Code Playgroud)
在相同的REST方法上,(更新)@Pretty Decorator被调用,而@Validate则没有.我在这做错了什么?
我发现一个旧的错误装饰器为Jaxb unmarshaller不工作,这是关闭的.
那里的评论说一切正常,上面的代码几乎就是那里的代码,包括解决方案.然而,对于Unmarshaller来说,没有任何作用.
最后这个问题在 JBoss AS 7 上得到了解决。
问题在于 Resteasy 实现,该实现在 2.3.5.Final 版本之前一直存在错误。
请参阅https://issues.jboss.org/browse/RESTEASY-711但忽略提到的解决方法,它直到版本 2.3.5 才起作用。
可行的解决方案是下载 Restwasy 发行版 2.3.5.Final 或更高版本,解压并查找resteasy-jboss-modules-2.3.5.Final.zip
将此文件解压到 JBoss AS 7.1.1 的根目录中,resteasy 将更新到新版本。完成这一步后,以上所有代码就可以正常工作了。
感谢比尔·伯克(Bill Burke)为我指出了解决方案,
| 归档时间: |
|
| 查看次数: |
4905 次 |
| 最近记录: |