问题描述
第一个Sorry for my bulky source code and simple question.
我收到此错误.
javax.ws.rs.ProcessingException:RESTEASY003215:找不到内容类型应用程序/json类型的编写器:com.acme.customers.lib.v1.Customer
完整跟踪:
--- exec-maven-plugin:1.5.0:exec (default-cli) @ acme-customers-api ---
Exception in thread "main" javax.ws.rs.ProcessingException: RESTEASY004655: Unable to invoke request: javax.ws.rs.ProcessingException: RESTEASY003215: could not find writer for content-type application/json type: com.acme.customers.lib.v1.Customer
at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.invoke(ManualClosingApacheHttpClient43Engine.java:287)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:488)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:65)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocationBuilder.post(ClientInvocationBuilder.java:226)
at com.acme.customers.api.rest.v1.test.ConsumingServices.main(ConsumingServices.java:67)
Caused by: javax.ws.rs.ProcessingException: RESTEASY003215: could not find writer for content-type application/json type: com.acme.customers.lib.v1.Customer
at org.jboss.resteasy.core.interception.jaxrs.ClientWriterInterceptorContext.throwWriterNotFoundException(ClientWriterInterceptorContext.java:50)
at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.getWriter(AbstractWriterInterceptorContext.java:302)
at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.syncProceed(AbstractWriterInterceptorContext.java:240)
at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:224)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.writeRequestBody(ClientInvocation.java:440)
at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.writeRequestBodyToOutputStream(ManualClosingApacheHttpClient43Engine.java:589)
at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.buildEntity(ManualClosingApacheHttpClient43Engine.java:548)
at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.loadHttpMethod(ManualClosingApacheHttpClient43Engine.java:455)
at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.invoke(ManualClosingApacheHttpClient43Engine.java:265)
... 4 more
Command execution failed.
org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:404)
at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:166)
at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:764)
at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:711)
at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:289)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)
at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
at org.apache.maven.cli.MavenCli.execute (MavenCli.java:957)
at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:289)
at org.apache.maven.cli.MavenCli.main (MavenCli.java:193)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
------------------------------------------------------------------------
BUILD FAILURE
------------------------------------------------------------------------
Total time: 5.277 s
Finished at: 2020-09-03T10:55:26-05:00
------------------------------------------------------------------------
Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.5.0:exec (default-cli) on project acme-customers-api: Command execution failed.: Process exited with an error: 1 (Exit value: 1) -> [Help 1]
To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.
For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
使用URL为 http://localhost:8080/api/v1/customers/createPurchaser
带有页眉
我的ConsumingServices
班级是
import java.util.Date;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;
public class ConsumingServices {
public static void main(String[] args) {
Customer customer = new Customer();
customer.setFirstName("John");
customer.setLastName("Mason");
customer.setEmail("john.mason@mail.com");
customer.setDateOfBirth(new Date());
customer.setStatus(CustomerStatus.ACTIVE);
ClientConfig configuration = new ClientConfig();
configuration.property(ClientProperties.CONNECT_TIMEOUT, 1000);
configuration.property(ClientProperties.READ_TIMEOUT, 1000);
Client client = ClientBuilder.newClient(configuration);
WebTarget target = client.target("http://localhost:8080/api/v1/customers");
Invocation.Builder invocationBuilder = target.path("createPurchaser")
.request(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON);
Response response = invocationBuilder
.header("Authorization", "1234")
.post(Entity.entity(customer, MediaType.APPLICATION_JSON));
if (response.getStatus() == Response.Status.OK.getStatusCode()) {
Purchaser purchaser = response.readEntity(Purchaser.class);
System.out.println("purchaser:".concat(purchaser.toString()));
} else {
if (MediaType.TEXT_PLAIN_TYPE.equals(response.getMediaType())) {
String message = response.readEntity(String.class);
System.out.println("message:" + message);
} else if (MediaType.APPLICATION_JSON.equals(response.getMediaType())) {
ApiError apiError = response.readEntity(ApiError.class);
System.out.println("apiError:".concat(apiError.toString()));
} else {
System.out.println("response.getMediaType():" + response.getMediaType());
String content = response.readEntity(String.class);
System.out.println("message:" + content);
}
}
}
}
例外行是 .post(Entity.entity(customer, MediaType.APPLICATION_JSON));
The Line with Exception is .post(Entity.entity(customer, MediaType.APPLICATION_JSON));
我在pom.xml
中的依赖关系是
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>acme-customers-lib</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
</dependency>
<dependency>
<groupId>fish.payara.extras</groupId>
<artifactId>payara-embedded-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/javax/javaee-web-api -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.31</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/jaxrs-api -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>3.0.12.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-client -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>4.5.6.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jaxrs -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.13.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jaxb-provider -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>4.5.6.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jboss.resteasy/resteasy-jackson2-provider -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>4.5.6.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
问题:如何解决此异常?
我班上的代码....
CustomerResource
类
@Path("/customers")
@ApplicationScoped
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class CustomerResource {
@POST
@Path("/createPurchaser")
public Response createPurchaser(Customer customer) {
return Response
.status(Response.Status.OK)
.entity(customerService.createPurchaser(customer))
.type(MediaType.APPLICATION_JSON)
.build();
}
}
CustomerService
界面
public interface CustomerService {
Purchaser createPurchaser(Customer customer);
}
CustomerServiceImpl
类的createPurchaser
方法
@ApplicationScoped
public class CustomerServiceImpl implements CustomerService {
@Override
public Purchaser createPurchaser(Customer customer) {
if (customer == null) {
throw new EmptyPayloadException(Customer.class.getSimpleName());
}
Purchaser client = new Purchaser();
client.setFirstName(customer.getFirstName());
client.setLastName(customer.getLastName());
client.setAffiliationDate(new Date());
client.setCustomerStatus(CustomerStatus.ACTIVE);
client.setPurchaserDocument(new PurchaserDocument());
client.getPurchaserDocument().setDateOfBirth(customer.getDateOfBirth());
client.getPurchaserDocument().setNumberDocument(new Random().nextLong());
client.getPurchaserDocument().setTypeDocument("CC");
return client;
}
}
Customer
类
import java.io.Serializable;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Customer extends BaseType implements Serializable {
private String firstName;
private String lastName;
private CustomerStatus status;
private String email;
private Date dateOfBirth;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public CustomerStatus getStatus() {
return status;
}
public void setStatus(CustomerStatus status) {
this.status = status;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
现在是BaseType
类
import java.util.Date;
public class BaseType {
private String id;
private Date createdAt;
private Date updatedAt;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date createdAt) {
this.createdAt = createdAt;
}
public Date getUpdatedAt() {
return updatedAt;
}
public void setUpdatedAt(Date updatedAt) {
this.updatedAt = updatedAt;
}
}
CustomerStatus
枚举
public enum CustomerStatus {
ACTIVE, INACTIVE
}
Purchaser
类
import java.io.Serializable;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Purchaser implements Serializable {
private String firstName;
private String lastName;
private Date affiliationDate;
private CustomerStatus customerStatus;
private PurchaserDocument purchaserDocument;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getAffiliationDate() {
return affiliationDate;
}
public void setAffiliationDate(Date affiliationDate) {
this.affiliationDate = affiliationDate;
}
public CustomerStatus getCustomerStatus() {
return customerStatus;
}
public void setCustomerStatus(CustomerStatus customerStatus) {
this.customerStatus = customerStatus;
}
public PurchaserDocument getPurchaserDocument() {
return purchaserDocument;
}
public void setPurchaserDocument(PurchaserDocument purchaserDocument) {
this.purchaserDocument = purchaserDocument;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Purchaser{firstName=").append(firstName);
sb.append(", lastName=").append(lastName);
sb.append(", affiliationDate=").append(affiliationDate);
sb.append(", customerStatus=").append(customerStatus);
sb.append(", purchaserDocument=").append(purchaserDocument);
sb.append('}');
return sb.toString();
}
}
PurchaserDocument
类
import java.io.Serializable;
import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class PurchaserDocument implements Serializable {
private String typeDocument;
private Long numberDocument;
private Date dateOfBirth;
public String getTypeDocument() {
return typeDocument;
}
public void setTypeDocument(String typeDocument) {
this.typeDocument = typeDocument;
}
public Long getNumberDocument() {
return numberDocument;
}
public void setNumberDocument(Long numberDocument) {
this.numberDocument = numberDocument;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
推荐答案
问题是jersey-client
依赖性.您需要删除它.原因:通用ClientBuilder
是.您具有的JSON依赖项(会自动在RESTEast客户端中注册)resteasy-jackson2-provider
用于RESTEasy.因此,泽西岛客户无法识别它.您可以手动在客户端上注册提供程序,它应该可以工作.
The problem is the jersey-client
dependency. You need to remove it. Reason: The generic ClientBuilder
is built to always become a JerseyClientBuilder
when Jersey client is on the classpath. The JSON dependency you have (that automatically registers with the RESTEast client) resteasy-jackson2-provider
is for RESTEasy. So Jersey client doesn't recognize it. You could manually register the provider with the client and it should work.
client.register(JacksonJaxbJsonProvider.class);
但是,就像我说的那样,只需删除jersey-client
,ClientBuilder
就会变成ResteasyClientBuilder
,它会识别resteasy-jackson2-provider
并自动注册它.除非您的目标是使用Jersey客户端,否则,您需要手动注册提供商,或添加Jersey自动注册依赖项,即jersey-media-json-jackson
.
But like I said, just remove jersey-client
and ClientBuilder
will become ResteasyClientBuilder
and it will recognize the resteasy-jackson2-provider
and automatically register it. Unless your goal is to use the Jersey client, in which case, you need to manually register the provider, or add the Jersey auto-register dependency, which is jersey-media-json-jackson
.
请注意,如果您打算在服务器环境中使用客户端,我只是注意到您正在使用Payara,而Payara在后台使用了Jersey.因此服务器已经配备了所有Jersey震击器.如果要使用Jackson作为您的提供者,则应添加jersey-media-json-jackson
并在客户端中注册JacksonFeature
.如果您不这样做,它将默认使用JSONB作为JSON提供程序.如果要使用RESTEasy,则可以忘记此操作.
Note, if you plan on using the client in the server environment, I just noticed that you are using Payara, which uses Jersey under the hood. So the server is already equipped with all the Jersey jars. If you want to use Jackson as your provider, you should add jersey-media-json-jackson
and register the JacksonFeature
with the client. If you don't do this, it will default to using JSONB as the JSON provider. If you want to use RESTEasy, then you can forget this.
这篇关于javax.ws.rs.ProcessingException,在Payara Server 5中找不到内容类型为application/json类型的编写器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!